现在用C#调用不知道是C还是C++写的DLL库,涉及到结构体嵌套时参数传递的问题,在网上找了各种方法都跟我这个不太一样,也试了各种方法都过不去,求助。
c++结构体如下,DLL无法改写。
C/C++ code
//被嵌套结构体
typedef struct {
CHAR a[ 19 ];
CHAR b;
WORD c;
} OBE, *LPOBE;
//外层结构体
typedef struct {
DWORD d;
OBE ObeInfo;
} CARD, *LPCARDT;
尝试了C#的结构体定义如下:
C# code
//被嵌套结构体
[StructLayout(LayoutKind.Sequential)]
public struct OBE{
[MarshalAs(UnmanagedType.ByValArray,SizeConst=19)]
public char[] a;
public char b;
public uint16 c;
}
//外层结构体
[StructLayout(LayoutKind.Sequential)]
public struct CARD{
public uint d;
//这个地方不知道怎么写了!!!
[MarshalAs(UnmanagedType.Struct)]
public OBE ObeInfo;
}
报AccessViolationException异常,提示我正在访问不可读写的内存。
CHAR -> byte
StructLayout的约定最好声明完整
例如
C# code
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
在结构体中嵌套结构体,没有特殊的写法
直接写就可以
C# code
public struct SServer
{
public SAdvance m_advanceCfg;
}
char[] 也可以用string来对应
C# code
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 19)]
public string mStrTemp;
把char改为byte就对了。其它的看似正常