设置“;将wchar_t视为内置类型“”;到“不影响C#互操作”

本文关键字:影响 互操作 置类型 不影响 wchar 设置 内置 | 更新日期: 2023-09-27 18:27:37

我有一个使用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++更改,或者这很好,而我的问题在其他地方?

谢谢你的帮助。

设置“;将wchar_t视为内置类型“”;到“不影响C#互操作”

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

此选项表示编译器将wchar_t C++类型视为内置类型,而不是unsigned shorttypedef。这是最新版本的C++语言(并非如此)所要求的,但旧版本的MS C++编译器做得不好。

所以现在你有两个选择:C++标准方式:(正确的方式™)以及背面兼容方式(MS方式™).

但这种差异(内置类型与typedef类型)只有在进行函数重载、模板专门化或类似操作时才会显著。C#互操作只关心二进制兼容性,此选项不会改变这一点(wchar_t在这两种情况下都是无符号的16位整数)。