将""Treat wchar_t as built-in type""设置为"否"是否会影响 C# 互操作?
Does setting "Treat wchar_t as built-in type" to No affect C# 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++更改,或者这很好,而我的问题在其他地方?
谢谢你的帮助。
简短的回答是:不,它不会以任何方式影响Interop。
此选项表示编译器将wchar_t
C++类型视为内置类型,而不是unsigned short
的typedef
。这是最新版本的C++语言(并非如此)所要求的,但旧版本的MS C++编译器做得不好。
所以现在你有两个选择:C++标准方式:(正确的方式™)以及背面兼容方式(MS方式™).
但这种差异(内置类型与typedef类型)只有在进行函数重载、模板专门化或类似操作时才会显著。C#互操作只关心二进制兼容性,此选项不会改变这一点(wchar_t
在这两种情况下都是无符号的16位整数)。
相关文章:
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 检查nullptr是否100%保护内存布局不受segfault影响
- 是否有任何区域设置会影响宽字符编码?
- 是否可以影响 C++ 中回调函数的局部变量?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 隐式转换函数的返回对象时是否会影响性能?
- 委派的 ctor 是否受参数计算顺序的影响?
- 如果我只使用指向基类的指针,更改私有派生类是否会影响 ABI?
- 在渲染之前直接上传是否会对性能产生负面影响
- 当取消引用运算符 (*) 重载时,*this 的使用是否受到影响?
- 添加字符串和文字,顺序如何影响是否可以正确添加字符串
- static关键字是否影响作用域
- _T宏是否影响 std::string 构造函数
- std::locale::global是否影响printf()函数
- 重载圆括号()是否影响构造函数调用
- static_cast是否影响简单类型float的Boost
- clear()是否影响std::unordered_set的bucket计数
- 抛出异常是否影响errno或设置最后错误码
- 弃用是否影响应用程序的运行时
- setbuf()是否影响cout