Mat*_*lin 5 c c# c++ string type-conversion
我正在开发带有 C 包装器的 C++ DLL,以便能够在不同的语言上使用它。目前,我也在 C# 中开发一个插件,它调用我的 DLL。
\n\n我想要的是将字符串(文件的路径)作为 DLL 的参数传递,以便能够在我的 DLL 上使用它。
\n\nC#
\n\n[DllImport(DllName, CallingConvention = DllCallingConvention)]\npublic static extern IntPtr AllocateHandle(string filename);\nRun Code Online (Sandbox Code Playgroud)\n\nC 包装纸
\n\nLPVOID SAMPLEDLL_API CALLCONV_API AllocateHandle(char* filename);\nRun Code Online (Sandbox Code Playgroud)\n\nC++ 类构造函数
\n\nCustomData::CustomData(char* filename)\n{\n _filename = filename; // string _filename;\n}\nRun 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问题是 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