设置“;将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++更改,或者这很好,而我的问题在其他地方?
谢谢你的帮助。
简短的回答是:不,它不会以任何方式影响Interop。
此选项表示编译器将wchar_t
C++类型视为内置类型,而不是unsigned short
的typedef
。这是最新版本的C++语言(并非如此)所要求的,但旧版本的MS C++编译器做得不好。
所以现在你有两个选择:C++标准方式:(正确的方式™)以及背面兼容方式(MS方式™).
但这种差异(内置类型与typedef类型)只有在进行函数重载、模板专门化或类似操作时才会显著。C#互操作只关心二进制兼容性,此选项不会改变这一点(wchar_t
在这两种情况下都是无符号的16位整数)。