c# - 将 "Treat wchar_t as built-in type"设置为 No 会影响 C# 互操作吗?

标签 c# c++ visual-studio visual-studio-2010 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++ 更改,或者这很好但我的问题出在其他地方?

感谢您的帮助。

最佳答案

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

此选项表示编译器将 wchar_t C++ 类型视为内置类型,而不是 unsigned shorttypedef。这是(不太)最新版本的 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/

相关文章:

c# - 如何确定是否需要 Copy Local

visual-studio - Visual Studio 将每个项目输出放在单独的文件夹中是否有原因?

c# - 可选的线程安全(线程安全部分仅在条件下)

c# - Silverlight DataGrid 中的选定项

c# - Windows Media 编码器对象不是在 MS Server 2003 64 位上的 ASP.NET 中创建的

c++ - VTK:对齐两个 Actor

c++ - 没有默认构造函数的对象数组初始化

c++ - 通过类引用

c++ - 为什么 DLL 没有复制到输出目录? C++ Visual Studio

c# - 此类型分配错误是 WCF 或 Windows Workflow Foundation 4.5 中的错误吗?