将字符串转换为 char* 到字符串 (C# -> C -> C++)

Mat*_*lin 5 c c# c++ string type-conversion

我正在开发带有 C 包装器的 C++ DLL,以便能够在不同的语言上使用它。目前,我也在 C# 中开发一个插件,它调用我的 DLL。

\n\n

我想要的是将字符串(文件的路径)作为 DLL 的参数传递,以便能够在我的 DLL 上使用它。

\n\n

C#

\n\n
[DllImport(DllName, CallingConvention = DllCallingConvention)]\npublic static extern IntPtr AllocateHandle(string filename);\n
Run Code Online (Sandbox Code Playgroud)\n\n

C 包装纸

\n\n
LPVOID SAMPLEDLL_API CALLCONV_API AllocateHandle(char* filename);\n
Run Code Online (Sandbox Code Playgroud)\n\n

C++ 类构造函数

\n\n
CustomData::CustomData(char* filename)\n{\n    _filename = filename; // string _filename;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我将 _filename 保存在文件上时(因为我没有找到使用 DLL 上的断点进行调试的方法),我有类似\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c\xc3\x8c0\xc3\xa0\xc3\x97. 我尝试了不同的解决方案将 char* 转换为字符串,但结果仍然相同。

\n\n

预先感谢您的帮助。

\n

Ada*_*cki 2

问题是 C# 中的字符串采用 Unicode。cpp中的字符串是ansi字符串。您必须告诉 C# 该字符串必须是 ansi:

[DllImport(DllName.dll, CallingConvention=CallingConvention.StdCall, CharSet=CharSet.Ansi)]
static extern IntPtr AllocateHandle(string filename);
Run Code Online (Sandbox Code Playgroud)

您还可以传递字符串长度作为第二个参数,这样您就可以知道 cpp 端的字符串长度是多少。

[编辑]

根据一些评论,您也可以尝试将 [char *] 更改为 [wchar_t *],这是 unicode。那么你当然应该在 C# 端使用适当的属性:CharSet=CharSet.Unicode

  • 默认的不是“Ansi”吗?https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.charset(v=vs.110).aspx (3认同)
  • https://msdn.microsoft.com/en-us/library/4bb3e64h.aspx - 这表明只有某些语言支持多字节字符串。比如日语或者中文。通常 ANSI 是每个字符一个字节。Unicode 字符集更宽。在 unicode 中,每种语言中的每个字符都用多个字节进行编码。UTF8 每个字符可以有 1 到 4 个字节。 (3认同)
  • @Bigiansen Ansi 是每个字符 1 字节,Unicode 使用 2 字节来表示字符串中的字符,如果 op 想要使用英语字符以外的其他字符,它们应该是 unicode (2认同)