将 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# 字符串