将 C# 字符串传递给 C++ dll 在发布版本中失败

Posted

技术标签:

【中文标题】将 C# 字符串传递给 C++ dll 在发布版本中失败【英文标题】:pass C# string to C++ dll fails in Release build 【发布时间】:2014-03-18 13:42:12 【问题描述】:

我有一个具有简单功能的 C++ dll,例如

#ifdef BUILDING_THE_DLL
#define EXPORTED __declspec(dllexport)
#else
#define EXPORTED __declspec(dllimport)
#endif
 ...
EXPORTED void AddSetting(char *key, char *value)

还有一个带有函数声明的 C# 项目:

[DllImport("pers.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void AddSetting(string key, string value);

在调试模式下构建 C# 项目时,一切正常。在 Release 构建中引发异常:“尝试加载格式不正确的程序。”

有什么想法吗?

UPD: 在 C# 项目中,平台目标在 Debug 模式下设置为 x86,在 Release 中设置为 Any CPU。我已在 Release 中更改为 x86,这就是解决方案。非常感谢马特。

【问题讨论】:

【参考方案1】:

默认情况下,您需要指定使用 ansi 格式的字符串。它是 unicode。应该是:

[DllImport("pers.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet::Ansi)]
public static extern void AddSetting(string key, string value);

另外,如果“AddSetting”函数修改了字符串,你需要在C#中使用StringBuilder。详情请参考此 MSDN article。

【讨论】:

设置 ANSI 没有帮助。并且函数不会修改它的参数。 @SkySurfer 能否展示一下 AddSetting 的源代码? AddSetting 有一行代码 - 它是一个带有 const char* 参数的函数调用。它只是一个包装器。 现在我想知道为什么它在没有 CharSet.Ansi 的情况下在调试模式下工作。实际上调试和发布版本之间有什么区别? @SkySurfer 另一个可能的原因:将 64 位 dll 加载到 32 位进程中,请参见:***.com/questions/5811955/…

以上是关于将 C# 字符串传递给 C++ dll 在发布版本中失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 DLL 将 C# StringBuilder / 字符串传递给 C++ char*

将 c++ dll 的 char 指针数组传递给 c# 字符串

将 C# 字符串传递给 C++,并将 C++ 结果(字符串、char*.. 任何)传递给 C#

将 C# 字符串数组传递给 C++

如何将 uint[] c# 传递给 c++ dll?

如何将 C# 中的二维数组传递给 C++ DLL?