我有一个使用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 ++更改,或者这很好,我的问题出在其他地方?
感谢您的帮助。
答案 0 :(得分:3)
简短回答是:不,它不会以任何方式影响Interop。
此选项表示编译器将wchar_t
C ++类型视为内置类型,而不是typedef
unsigned short
。这是(不是)最新版本的C ++语言所要求的,但旧版本的MS C ++编译器没有做到这一点。
所以现在你有两个选择:C ++标准方式:( Right Way™)和后向兼容方式(MS Way™)。
但是,当您执行函数重载,模板特化等时,这种差异(内置类型与typedef类型)才有意义。 C#Interop仅关注二进制兼容性,并且该选项没有改变(wchar_t
在两种情况下都是无符号的16位整数)。