小编Sla*_*awa的帖子

在C#中将字符串数组编组为char**

我正在调用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)

c# arrays string pointers marshalling

5
推荐指数
1
解决办法
5902
查看次数

标签 统计

arrays ×1

c# ×1

marshalling ×1

pointers ×1

string ×1