我有一个返回AnsiString的外部DLL。
我已经设置了我的代码:
[DllImport("CDCrypt.dll", CharSet = CharSet.Ansi)]
public static extern string Decrypt(string s);
public string myDllMessage()
{
return DllMessage("Û(ÉÄ´-zÕ< tÆ");
}
使用外部dll引用从AnsiString转换为String吗?
答案 0 :(得分:1)
您可以指定字符集:
[DllImport("CDCrypt.dll", CharSet = CharSet.Ansi)]
public static extern string DllMessage();
此外,请注意返回字符串的方法签名,因为可能会导致内存泄漏。
答案 1 :(得分:1)
返回字符串的函数是内存管理问题。有人将不得不释放字符串的内存。 pinvoke marshaller将尝试处理它,它使用CoTaskMemFree()。
这在实践中不太可能解决,本机代码很少使用CoTaskMemAlloc()来分配字符串的内存。在XP上,这会产生不可插拔的内存泄漏,在Vista和Win7上会导致程序崩溃。他们有一个更严格的堆管理器。
您唯一能做的就是将返回类型声明为IntPtr。然后用Marshal.PtrToStringAnsi()自己编组返回值。这肯定会奏效,你获得适当价值的可能性非常小。该字符串将从Unicode转换为Ansi,这是一个有损转换。然后你必须释放内存。你不能。你无法对此功能进行调整。