2015-07-02 63 views
8

我有一些从.NET系统命名空间类派生的C++/CLI代码。通用Windows平台应用程序和C++/CLI(VS 2015 RC1)

有没有办法重用这个代码的通用Windows平台应用程序?

我不能在C++中获得对System Namespace的引用,尽管在C#中是可以的。看起来好像只支持C++/Cx代码,而不支持托管的C++/CLI。

+0

汉斯帕萨特是这方面的专家,我会注意他的答案。 –

回答

17

C++/CX扩展的语法和关键字类似于很多C++/CLI。但这就是相似性结束的地方,它们没有任何共同之处。 C++/CX直接编译为本地代码,就像本地C++一样。但是C++/CLI被编译为.NET的中间语言MSIL。它们的语法看起来非常相似,因为它们都解决了同样的问题,将C++连接到外部类型系统。在C++/CLI的情况下为.NET,在C++/CX的情况下为WinRT。

这是您不能使用System命名空间的基本原因,它是一个.NET命名空间。您可以使用std名称空间,以及用于WinRT特定类型的PlatformWindows名称空间。编译器无法导入带有/ ZW编译选项的.NET引用程序集,只有WinRT元数据文件(扩展名为.winmd)。这是COM .tlb类型库文件格式的扩展,您以前必须使用#import指令导入。

这本身就是混淆的另一个主要来源,内部.winmd文件格式基于.NET元数据的格式。正因为如此,大多数.NET反编译器都可以显示.winmd文件的内容。但是再次只是表面的相似性,它与.NET程序集完全无关。它可以包含声明,而不是代码。最好将它与您在本地C++项目中使用的.h文件进行比较。或者如果您以前曾暴露于COM,则为.tlb文件。

了解COM如何工作可以帮助您理解这一切。事实上,COM就是WinRT的核心,这就是为什么你的C++/CX项目可以被一个完全不同的语言如Javascript或VB.NET编写的程序轻松使用的基本原因。一个WinRT应用程序实际上是一个进程外COM服务器。类库或WinRT组件实际上是一个进程内COM服务器。 COM对象工厂的工作方式不同,范围仅限于包清单中指定的文件。 C++/CX是隐藏COM的语言预测的一部分,以及实现Platform命名空间的C++库链接。如果程序员必须编写传统的COM客户端代码,WinRT仍然是天生的。您仍然可以使用本地C++,WRL库几乎不会隐藏管道。

WinRT很容易支持用像C#或VB.NET这样的托管语言编写的代码,语言投影内置在框架中,并且非常隐蔽。但不是C++/CLI,这是一个结构性限制。商店/电话/通用应用程序定位名为.NETCore的.NET Framework的子集。这些日子更好地被称为CoreCLR,即开源的部分。它不支持模块初始化器,这对C++/CLI很重要。


足够的介绍并得到答案:不,你没有用于你的C++/CLI代码,你将不得不重写它。在移植C++/CLI包装程序接口的本机C++代码时,只要它遵守API限制,就会有一个不错的选择。你应该总是先从那里开始,因为它很容易做,并立即告诉你,如果你的本地C++代码使用的API函数,这种类型的电池耗尽太快或违反沙箱限制。

然而,ref class包装必须进行重大调整。有理由认为这将是一个主要障碍,它仍然可以在结构上类似。最大的限制是缺乏对实现继承的支持,COM限制以及不得不使用.NET Framework类型的代码替换为等效的C++代码。典型的挂断是它往往有很多,原来的作者通常会赞成非常方便的.NET类型,而不是标准的C++库类型。因人而异。

+2

我不能相信这没有upvoted。他们从知道的人那里得到建议并忽略它。 –

相关问题