【发布时间】:2011-04-23 13:27:30
【问题描述】:
假设一个dll包含以下函数
extern "C" __declspec(dllexport) void f(bool x)
{
//do something
}
extern "C" __declspec(dllexport) const char* g()
{
//do something else
}
我在 C# 中使用这些函数的第一个天真的方法如下:
[DllImport("MyDll.dll")]
internal static extern void f(bool x);
[DllImport("MyDll.dll")]
internal static extern string g();
第一个惊喜是 C++ bool 没有转换为 C# bool(奇怪的运行时行为,但没有崩溃)。所以我不得不将 bool 更改为 byte 并手动从一个转换为另一个。所以,第一个问题是,有没有更好的方法来编组 bool(注意这是 bool,而不是 BOOL)
第二个惊喜是 dll 函数返回的原始字符串被 C# 字符串所拥有,而不是像我预期的那样被复制,最终 C# 代码释放了 dll 返回的内存。我发现这一点是因为程序崩溃了,但后来我将返回类型更改为 sbyte* 并使用已经完成复制的指针手动初始化字符串。所以第二个问题是: 2.1:有没有更好的方法来防止编组的字符串拥有指针。 2.2:见鬼?!为什么 C# 会这样做?我的意思是,一个明显的情况是 dll 函数返回一个文字,而 C# 试图删除它...
提前致谢,希望我的问题不是含糊不清或难以理解。
【问题讨论】:
标签: c# c++ c interop marshalling