代码之家  ›  专栏  ›  技术社区  ›  SkySurfer

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

  •  0
  • SkySurfer  · 技术社区  · 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#项目在调试模式下构建时,一切都工作得很好。在版本构建中,引发异常:“试图加载格式不正确的程序。”

    有什么想法吗?

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

    1 回复  |  直到 12 年前
        1
  •  2
  •   Matt    12 年前

    默认情况下,您需要指定使用字符串的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 详细信息。