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

标签 c# c++ dll marshalling

我有一个具有简单功能的 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);

在 Debug模式下构建 C# 项目时,一切都运行良好。在 Release build 中会触发异常:“尝试加载格式不正确的程序。”

有什么想法吗?

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

最佳答案

需要指定使用字符串的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了解详情。

关于c# - 将 C# 字符串传递给 C++ dll 在发布版本中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22481230/

相关文章:

C++ DLL 浮点确定性

c# - Javascript - 调用 ASP.NET WebService - 服务器方法 'methodName' 失败

c# - MySQL 存储过程通过 .Net 每隔一个调用工作一次

c++ - 如何重定向 LLI 输出?

c++ - 将 map 转换为在 STL 中设置

c++ - MatLab C++ 共享 Dll 库初始化崩溃

c# - 在GAC中注册并调用.exe

c# - 如何将 linq 查询返回到单个对象

c# - 扩展方法找不到类型的定义

c++ - 删除空指针是否安全?