【发布时间】:2012-03-01 14:10:38
【问题描述】:
我在 DLL 中有一个 C++ 函数,它接受一个指向结构 JPInfo 的指针,该结构在函数中填充了从服务器接收的数据,C++ 结构的布局如下所示:
typedef struct JP
{
unsigned char type;
DWORD value;
} JP;
typedef struct JPInfo
{
JP jps[3];
_int16 ConT;
_int16 CallT;
unsigned char ret;
unsigned char count;
unsigned char JPOffset;
unsigned char JPPeriod;
} JPInfo;
函数在 DLL 中导出如下:
__declspec(dllexport) DWORD __stdcall GetJPInfo(JPInfo* jpi, DWORD time);
该函数需要一个指向 JPInfo 结构的指针,我试图在 C# 中模拟这个结构
[StructLayout(LayoutKind.Sequential, Size = 5), Serializable]
public struct JP
{
byte type;
int value;
}
[StructLayout(LayoutKind.Sequential,Size=23),Serializable]
public struct JPInfo
{
JP[] jps;
Int16 ConT;
Int16 CallT;
byte ret;
byte count;
byte JPOffset;
byte JPPeriod;
}
我尝试像这样从 C# 调用函数:
[DllImport("DLLImp.dll")]
unsafe public static extern int GetJP(ref JPInfo jpi, int time);
// then in main...
JPInfo jpi = new JPInfo;
GetJackpotValues(ref jpi, 4000);
我收到“System.ExecutionEngineException”类型的未处理异常。我的 JPInfo 结构中没有固定大小的 JP 结构数组,所以我不知道如何处理。
谢谢。
【问题讨论】:
-
尽量不要明确指定 sie 并且默认 Marshaller 会执行此操作。 (大小=23,5 等)