Marshal管理string []到非托管char **

时间:2010-04-20 02:04:56

标签: c# c++ string marshalling

这是我的c ++结构(使用多字节字符集)

typedef struct hookCONFIG {
    int threadId;
    HWND destination;

    const char** gameApps;
    const char** profilePaths;
} HOOKCONFIG;

和.Net struct

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct HOOKCONFIG {
    public int threadId;
    public IntPtr destination;

    // MarshalAs?
    public string[] gameApps;

    // MarshalAs?
    public string[] profilePaths;
}

我遇到了一些问题,如何编组字符串数组? 当我在C ++中访问struct变量“profilePaths”时,我收到如下错误:

  

App.exe

中发生了未处理的“System.AccessViolationException”类型异常      

附加信息:尝试读取或写入受保护的内存。这通常是一个   表明其他内存已损坏。

MessageBox(0, cfg.profilePaths[0], "Title", MB_OK); // error ... Orz

1 个答案:

答案 0 :(得分:1)

简单方法:将原型更改为IntPtr []:

public IntPtr[] gameApps;
public IntPtr[] profilePaths;

现在,当你打电话时,你需要大致以下的psudo代码:

GCHandle handle = GCHandle.Alloc(string);
gameApps = new IntPtr[] { GCHandle.ToIntPtr(handle) };

// Unmanaged call

handle.Free();