将C#字符串传递给C++;dll在发布版本中失败 我有一个C++函数,具有简单的函数,如 #ifdef BUILDING_THE_DLL #define EXPORTED __declspec(dllexport) #else #define EXPORTED __declspec(dllimport) #endif ... EXPORTED void AddSetting(char *key, char *value)

将C#字符串传递给C++;dll在发布版本中失败 我有一个C++函数,具有简单的函数,如 #ifdef BUILDING_THE_DLL #define EXPORTED __declspec(dllexport) #else #define EXPORTED __declspec(dllimport) #endif ... EXPORTED void AddSetting(char *key, char *value),c#,c++,dll,marshalling,C#,C++,Dll,Marshalling,以及一个带有功能声明的C#项目: [DllImport("pers.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void AddSetting(string key, string value); 当C#项目在调试模式下构建时,一切都运行良好。在发布版本中,会触发异常:“试图加载格式不正确的程序。” 有什么想法吗 UPD:在C#项目平台中,目标在调试模式下设置为x86,任何CPU都在发布中。我

以及一个带有功能声明的C#项目:

[DllImport("pers.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void AddSetting(string key, string value);
当C#项目在调试模式下构建时,一切都运行良好。在发布版本中,会触发异常:“试图加载格式不正确的程序。”

有什么想法吗


UPD:在C#项目平台中,目标在调试模式下设置为x86,任何CPU都在发布中。我在发行版中改为x86,这就是解决方案。非常感谢Matt。

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

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

此外,如果函数“AddSetting”修改字符串,则需要在C#中使用StringBuilder。有关详细信息,请参阅此MSDN。

设置ANSI没有帮助。函数不修改其参数。@SkySurfer您能显示AddSetting的源代码吗?AddSetting有一行代码-它是一个带有const char*args的函数调用。它只是一个包装器。现在我想知道为什么它在调试模式下没有CharSet.Ansi就可以工作。。事实上,调试版本和发布版本之间有什么区别?@SkySurfer另一个可能的原因是:将64位dll加载到32位进程中,请参见以下内容: