我有一个使用 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++ 类型视为内置类型,而不是 unsigned short
的 typedef
。这是(不太)最新版本的 C++ 语言所要求的,但旧版本的 MS C++ 编译器并没有做到这一点。
现在您有两个选择:C++ 标准方式:(The Right Way™) 和向后兼容方式 (The MS Way™)。
但是这种差异(内置类型与 typedef 类型)仅在您进行函数重载、模板特化或类似操作时才显着。 C# Interop 只关心二进制兼容性,并且此选项未改变这一点(wchar_t
在这两种情况下都是无符号 16 位整数)。
关于c# - 将 "Treat wchar_t as built-in type"设置为 No 会影响 C# 互操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9693022/