【发布时间】:2011-11-04 09:08:47
【问题描述】:
您好,我用 c# 编写了一个包装器,但遇到了一些问题。我在 C++ 中有这个结构。
typedef struct pjmedia_format
{
pj_uint32_t id;
pjmedia_type type;
pjmedia_format_detail_type detail_type;
union
{
pjmedia_audio_format_detail aud;
pjmedia_video_format_detail vid;
char user[PJMEDIA_FORMAT_DETAIL_USER_SIZE];
} det;
} pjmedia_format;
这是指向此结构pjmedia_format的链接
在 c# 中我有这个:
[StructLayout(LayoutKind.Sequential)]
public struct pjmedia_format
{
public uint id;
public pjmedia_type type;
public pjmedia_format_detail_type detail_type;
public det_t det;
}
[StructLayout(LayoutKind.Explicit)]
public struct det_t
{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.Struct)]
public pjmedia_audio_format_detail aud;
[FieldOffset(36)]
[MarshalAs(UnmanagedType.Struct)]
public pjmedia_video_format_detail vid;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
[FieldOffset(60)]
public char[] user;
}
[StructLayout(LayoutKind.Sequential)]
public struct pjmedia_audio_format_detail
{
public uint clock_rate;
public uint channel_count;
public uint frame_time_usec;
public uint bits_per_sample;
public int avg_bps;
public int max_bps;
}
[StructLayout(LayoutKind.Sequential)]
public struct pjmedia_video_format_detail
{
public pjmedia_rect_size size;
public pjmedia_ratio fps;
public int avg_bps;
public int max_bps;
}
当我想使用这个结构时,我得到了这个错误
System.Runtime.InteropServices.MarshalDirectiveException 未处理。 Message="方法签名与元素不兼容 PInvoke。"
我尝试使用一些属性,如大小或包装,但没有帮助(可能我用错了)。我单独测试了其他结构,例如pjmedia_video_format_detail 他们运作良好。有什么建议吗?
最好的问候 安德烈
【问题讨论】:
-
你为什么不做
Interface? -
@Shivan 对具有特定布局的 PInvoke 结构有什么帮助以任何方式?
标签: c# c++ pinvoke marshalling