c#PInvoke w_char_t **

时间:2013-05-25 16:33:44

标签: interop pinvoke

我有以下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#的正确方法吗?

此致

约翰

1 个答案:

答案 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)]。然后框架为您处理所有的重新分配和编组。