将“将wchar_t视为内置类型”设置为No会影响C#interop吗?

时间:2012-03-13 22:13:13

标签: c# c++ visual-studio visual-studio-2010 interop

我有一个使用C ++ DLL的C#应用​​程序。这一直工作正常但我现在必须将“将wchar_t作为内置类型”从“是(/ Zc:wchar_t)”更改为“否(/ Zc:wchar_t-)”并且我的C#应用​​程序变得非常不稳定。 C ++和C#之间的互操作层包含一些字符串作为函数参数,结构如下:

C ++:

typedef struct
{
    // Used to be: WCHAR wstrName[256];
    wchar_t wstrName[256];
} sdevicemodel_t;

C#:

namespace Thingy
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct DeviceModel
    {
        // info
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string Name;
    }
}

我是否需要更改此声明以匹配C ++更改,或者这很好,我的问题出在其他地方?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

简短回答是:不,它不会以任何方式影响Interop。

此选项表示编译器将wchar_t C ++类型视为内置类型,而不是typedef unsigned short。这是(不是)最新版本的C ++语言所要求的,但旧版本的MS C ++编译器没有做到这一点。

所以现在你有两个选择:C ++标准方式:( Right Way™)和后向兼容方式(MS Way™)。

但是,当您执行函数重载,模板特化等时,这种差异(内置类型与typedef类型)才有意义。 C#Interop仅关注二进制兼容性,并且该选项没有改变(wchar_t在两种情况下都是无符号的16位整数)。