gpt4 book ai didi

c# - C++ dll 返回的字符串在 C# 调用程序中已损坏,为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:16 29 4
gpt4 key购买 nike

我有一个调用 C++ DLL 的 C# 应用。

在C#中,我有如下代码:

[DllImport(@"111.dll", CharSet = CharSet.Unicode)]
public extern static String Func1(String arg);
......
String arg = "test text";
String retstring = Func1(arg);

在CPP中,我定义的函数如下:

extern "C"
{
__declspec(dllexport) LPWSTR Func1(LPWSTR arg)
{
....
LPWSTR ret1 = L"1?2?3?4?5";
LPWSTR ret2 = SomeActualFunction(arg);
retturn ret1; // return ret2;
}
}

如果我在 C++ 的 Func1() 中返回 ret1,一切正常。在 VS2008 的内存窗口中,我可以看到正确的 Unicode 二进制文件。在 C++ 中,ret1 的二进制文件是

“31 00 3f 00 32 00 3f 00 33 00 3f 00 34 00 3f 00 35 00”

,在 C# 中,retstring 的二进制文件是

“28 67 a3 f7 fe 07 00 00 0a 00 00 00 09 00 00 00 31 00 3f 00 32 00 3f 00 33 00 3f 00 34 00 3f 00 35 00”

.我认为 C# 二进制文件

“28 67 a3 f7 fe 07 00 00 0a 00 00 00 09 00 00 00”

是System.String类型的header。

此外,如果我在 CPP 代码中的 return 之前添加以下行,我也可以在 C# 代码中获得正确的 retstring:

ret2 = L"1?2?3?4?5";

但是当我在 C++ DLL 中返回 ret2 时,C# 中返回的字符串 ret 似乎已损坏。根据我的检查,C++ DLL 中的二进制文件是正确的 Unicode。但是C#代码中retstring的二进制是

“28 67 a3 f7 fe 07 00 00 0a 00 00 00 09 00 00 00 dd dd dd dd dd dd dd dd dd dd ....”。

我只能注意到 ret2 比 ret1 长 - ret2 有数百个 WCHAR。

有什么想法吗?提前致谢。

最佳答案

为此,我总是会使用 BSTR,因为它使内存分配/解除分配的责任变得透明。

C++

#include <comutil.h>
BSTR GetSomeText()
{
return ::SysAllocString(L"Greetings from the native world!");
}

C#

[DllImport(@"test.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.BStr)]
private static extern string GetSomeText();

您没有说明您的字符串是如何分配的,但是一旦您使用动态分配的字符串,您就需要解决该问题。 BSTR 的伟大之处在于它使用共享的 COM 分配器,这使得 C# 编码器能够使用与分配它的 C++ 代码相同的分配器来释放字符串。

关于c# - C++ dll 返回的字符串在 C# 调用程序中已损坏,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6354358/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com