在 C 代码中,函数定义如下:
INT WINAPI myFunction(LPCTSTR str1, LPCTSTR str2, INT iNumber,
LPSTRUCT *lpStruct);
*lpStruct
是一个结构类型的指针数组:
typedef struct myStruct
{
CHAR m_s1[64];
UINT m_nS;
CHAR m_s2[8][64];
UINT m_nP;
CHAR m_s3[512];
} SomeStruct, *LPSTRUCT;
我需要myFunction
在 C# 中调用这个外部,我定义SomeStruct
为:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct SomeStruct
{
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 64)]
public string m_s1;
public uint m_nS;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 512)]
public string m_s2;
public uint m_nP;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 512)]
public string m_s3;
}
我的函数为:
[DllImport("some.dll")]
public static extern int myFunction(
string str1,
string str2,
int iNumber,
IntPtr[] lpStruct);
我在 C# 中初始化 IntPtr[]:
IntPtr[] lpptr = new IntPtr[iNumber];
我知道指针的结构数组有iNumber
元素。
调用这个函数没有错误(lpStruct[i]
有数字)。但是当我尝试使用以下命令编组指向结构的指针时:
SomeStruct st = (SomeStruct )Marshal.PtrToStructure(lpStruct[i],
typeof(SomeStruct ));
我收到错误消息:尝试写入只读内存。我不知道这里有什么问题。是 C# 中的外部函数定义错误还是 struct 定义错误,或两者兼而有之。