我有以下c ++功能,我无法改变(第三方):
[C ++]
int __stdcall TEST(wchar_t **xml, int &result_size)
{
// xml is instantiated here!
}
并[c#]
class native
{
[DllImport("somedll.dll")]
public static extern int TEST(StringBuilder a, ref int size);
{
}
}
示例:
StringBuilder b = new StringBuilder();
int size = 0;
native.Test(b,ref size)
stringbuilder对象只包含第一个字符。如果我调整对象的大小:
b。长度=大小;除第一个字符外,数据不正确。
这是将wchar_t **从c ++传递到c#的正确方法吗?
此致
约翰
答案 0 :(得分:3)
该函数将被调用,如下所示:
[DllImport(@"mylib.dll")]
static extern int TEST(out IntPtr xml);
我删除了大小参数,因为它不需要,因为你可以使用以null结尾的字符串。
像这样调用函数:
IntPtr xmlptr;
int retval = TEST(out xmlptr);
string xml = Marshal.PtrToStringUni(xmlptr);
// deallocate xmlptr somehow
棘手的一点是解除分配在本机端的内存。使用共享分配器,例如COM分配器。或者从本机代码中导出deallocator。
就个人而言,我会重新设计使用COM BSTR的界面。我有C ++返回BSTR,在管理端使用[MarshalAs(UnmanagedType.BStr)]。然后框架为您处理所有的重新分配和编组。