C++/CX 扩展的语法和关键字类似于C++/CLI 有很多。但这就是相似之处,它们没有任何共同点。 C++/CX 直接编译为本机代码,就像本机 C++ 一样。但 C++/CLI 被编译为 MSIL,即 .NET 的中间语言。它们的语法看起来非常相似,因为它们都解决相同的问题,将 C++ 与外部类型系统连接起来。如果是 C++/CLI,则为 .NET;如果是 C++/CX,则为 WinRT。
这就是不能使用 System 命名空间的基本原因,它是 .NET 命名空间。您可以使用std
命名空间,以及Platform
and Windows
WinRT 特定类型的命名空间。编译器无法导入 /ZW 编译选项有效的 .NET 参考程序集,只能导入 WinRT 元数据文件(文件扩展名为 .winmd 的文件)。它们是 COM .tlb 类型库文件格式的扩展,您之前必须使用 #import 指令导入这些文件格式。
这本身就是造成混乱的另一个主要来源,内部 .winmd 文件格式基于 .NET 元数据的格式。因此,大多数 .NET 反编译器都可以显示 .winmd 文件的内容。但同样只是表面上的相似,它与 .NET 程序集完全无关。它可以只包含声明,而不包含代码。最好将其与您在本机 C++ 项目中使用的 .h 文件进行比较。或者如果您以前接触过 COM,则可以使用 .tlb 文件。
了解 COM 的工作原理对于理解 COM 的含义非常有帮助。事实上,COM 是 WinRT 的核心,这也是 C++/CX 项目可以轻松地由用完全不同的语言(如 Javascript 或 VB.NET)编写的程序使用的基本原因。 WinRT 应用程序是actually进程外 COM 服务器。类库或 WinRT 组件实际上是进程内 COM 服务器。 COM 对象工厂的工作方式不同,范围仅限于包清单中指定的文件。 C++/CX 是语言投射它隐藏了 COM 以及您链接的实现平台命名空间的 C++ 库。如果程序员必须编写传统的 COM 客户端代码,WinRT 将胎死腹中。您仍然可以在本机 C++ 中使用,WRL 库几乎没有隐藏管道。
WinRT 很容易支持用 C# 或 VB.NET 等托管语言编写的代码,语言投影内置于框架中并且高度不可见。但 C++/CLI 则不然,这是一个结构限制。 Store/Phone/Universal 应用程序面向名为 .NETCore 的 .NET Framework 子集。如今,更广为人知的名称是 CoreCLR,这些部分都是开源的。它不支持模块初始值设定项,这对 C++/CLI 至关重要。
足够的介绍并得到答案:不,您的 C++/CLI 代码没有用处,您必须重写它。只要遵守 API 限制,您就可以很好地移植 C++/CLI 包装器所连接的本机 C++ 代码。您应该始终首先从那里开始,因为它很容易做到,并且会立即告诉您您的本机 C++ 代码是否正在使用verbotenapi 函数,这种函数会很快耗尽电池电量或违反沙箱限制。
The ref class
然而,包装器必须进行重大调整。没有理由假设这将是一个主要障碍,但它仍然可能结构上相似。最大的限制是缺乏对实现继承的支持、COM 限制以及必须用等效的 C++ 代码替换使用 .NET Framework 类型的代码。典型的问题是往往有很多,原始作者通常会更喜欢非常方便的 .NET 类型而不是标准 C++ 库类型。 YMMV。