【发布时间】:2009-12-04 22:20:25
【问题描述】:
我正在围绕非托管 DLL 编写托管包装器,但无法正确编组以下方法和结构。以下是非托管代码的 .h 文件中的内容:
typedef struct {
WORD PI_code;
DWORD grpStat[31];
BYTE PTY_code;
char* PS;
char* RT;
} RdsData_t;
COMPANYNAME_API void COMPANY_get_rds_data(RdsData_t* rds_data);
在 PInvoke Interop Assistant 的帮助下,这就是我的想法:
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct RdsData_t
{
/// WORD->unsigned short
public ushort PI_code;
/// DWORD[31]
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 31, ArraySubType = UnmanagedType.U4)]
public uint[] grpStat;
/// BYTE->unsigned char
public byte PTY_code;
/// char*
[MarshalAsAttribute(UnmanagedType.LPStr)]
public string PS;
/// char*
[MarshalAsAttribute(UnmanagedType.LPStr)]
public string RT;
}
[DllImport("companyname.dll", EntryPoint = "?COMPANYNAME_get_rds_data@@YAXPAURdsData_t@@@Z")]
private static extern void COMPANYNAME_get_rds_data(ref RdsData_t data);
但是,按原样调用时会引发 AccessViolationException。通过搜索和实验,我能够想出一些不会抛出异常的东西,但是数据不正确或丢失,让我相信那些也不正确。
我应该为上述结构使用什么互操作代码?除了 PInvoke 助手之外,还有什么工具可以帮助我吗?
提前致谢!
【问题讨论】:
-
如果您还没有去过那里,请查看pinvoke.net