【发布时间】:2021-07-28 14:50:56
【问题描述】:
假设我在库中导出了以下 C++ 函数:
void foo(const wchar_t* text);
以及使用该函数的 C# 代码:
[DllImport("bla.dll")]
static extern void foo([MarshalAs(UnmanagedType.LPWStr)] string text);
void Bar()
{
string s = "hello";
foo(s);
}
- 当我调用
foo时.net marshaller 是否复制字符串或指针是否指向s的缓冲区? - 如果值被复制,什么时候清理?
- 我必须自己清理吗(大概在
foo内部)? - 如果是,我该如何清理内存?
如果text 编组为:
UnmanagedType.LPWStrUnmanagedType.BStr
【问题讨论】:
-
无副本,.net 字符串与 const wchar_t* 兼容。 BSTR 需要被复制,marshaller 处理它并在调用后销毁副本。
标签: c# c++ pinvoke marshalling