我正在调用C DLL函数,需要提供以下C结构:
typedef struct
{
char *mTableId;
char **mFieldNames;
int mNumFields;
char *mFilter;
char *mSort;
int mOffset;
int mMaxRecords;
char *mTargetRecordFilter;
int mSurroundingRecordsCount;
int *mOwnerIds;
int mNumOwnerIds;
gsi_bool mCacheFlag;
} SAKESearchForRecordsInput;
Run Code Online (Sandbox Code Playgroud)
问题在于char**mFieldNames; 我试过像这样自动编组:
[MarshalAs(UnmanagedType.LPArray,ArraySubType = UnmanagedType.LPTStr,SizeConst = 9)] public String [] mFieldNames;
这样我在Marshal.SizeOf()中得到一个错误 - 无法计算正确的大小.然后我决定手动处理指针.它实际上只是一个指向C字符串数组的指针.这是我的代码导致的
System.AccessViolationException:尝试读取或写入受保护的内存.这通常表明其他内存已损坏.
所以我搞砸了指针.代码对我来说似乎没问题,bug在哪里?
C#:
[StructLayout(LayoutKind.Sequential)]
unsafe public class SAKESearchForRecordsInput {
[MarshalAs(UnmanagedType.LPTStr)]
public String mTableId;
//[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPTStr, SizeConst = 9)] // HARDCODED!?!
//public String[] mFieldNames; // char **mFieldNames;
public IntPtr mFieldNames;
public int mNumFields;
[MarshalAs(UnmanagedType.LPTStr)] …Run Code Online (Sandbox Code Playgroud)