0

我有以下无法更改的 c++ 函数(第 3 方):

[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.Length = size; 除第一个字符外,数据不正确。

这是将 wchar_t** 从 c++ 传递到 c# 的正确方法吗?

问候,

约翰

4

1 回答 1

3

该函数将像这样 p/invoked:

[DllImport(@"mylib.dll")]
static extern int TEST(out IntPtr xml);

我删除了大小参数,因为您可以使用以空字符结尾的字符串,因此不需要它。

像这样调用函数:

IntPtr xmlptr;
int retval = TEST(out xmlptr);
string xml = Marshal.PtrToStringUni(xmlptr);
// deallocate xmlptr somehow

棘手的一点是释放在本机端分配的内存。要么使用共享分配器,例如 COM 分配器。或者从本机代码中导出释放器。

我个人会重新设计界面以使用 COM BSTR。我会让 C++ 返回一个 BSTR,并在托管端使用 [MarshalAs(UnmanagedType.BStr)]。然后框架为您处理所有的释放和编组。

于 2013-05-27T07:26:29.813 回答