C#AnsiString to String

时间:2011-06-03 10:05:49

标签: c# string

我有一个返回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吗?

2 个答案:

答案 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,这是一个有损转换。然后你必须释放内存。你不能。你无法对此功能进行调整。