Mat*_*Sch 8 windows c++-cli visual-c++ win-universal-app
我有一些C++/CLI代码,它们源自.NET System Namespace类.
有没有办法将此代码重用于通用Windows平台应用程序?
我无法在C++中获得对系统命名空间的引用,尽管在C#中它是可能的.看起来只支持C++/Cx代码而不支持托管C++/CLI.
Han*_*ant 19
C++/CX扩展的语法和关键字类似于 C++/CLI.但这就是相似性结束的地方,它们没有任何共同之处.C++/CX直接编译为本机代码,就像本机C++一样.但是C++/CLI被编译为MSIL,它是.NET的中间语言.它们的语法看起来非常相似,因为它们都解决了同样的问题,将C++与外部类型系统连接起来..NET代表C++/CLI,WinRT代表C++/CX.
这是您无法使用System命名空间的基本原因,它是.NET命名空间.您改用std命名空间,与沿Platform和Windows命名空间WinRT的特定类型.编译器无法导入带有/ ZW编译选项的.NET引用程序集,只能导入WinRT元数据文件,文件扩展名为.winmd的文件.这是COM .tlb类型库文件格式的扩展,您之前必须使用#import指令导入它们.
这本身就是混淆的另一个主要来源,内部.winmd文件格式基于.NET元数据的格式.由于这个原因,大多数.NET反编译器都可以向您展示.winmd文件的内容.但同样只是表面上的相似之处,它与.NET程序集完全无关.它只能包含声明,而不是代码.最好将它与您在本机C++项目中使用的.h文件进行比较.或者.tlb文件,如果您以前曾接触过COM.
知道COM是如何工作的,可以非常有助于了解这是什么.实际上COM是WinRT的核心,这是为什么你的C++/CX项目可以被一个用完全不同的语言(如Javascript或VB.NET)编写的程序轻松使用的基本原因.WinRT应用程序实际上是一个进程外COM服务器.类库或WinRT组件实际上是进程内COM服务器.COM对象工厂的工作方式不同,范围仅限于包清单中指定的文件.C++/CX是语言投影的一部分隐藏COM,以及链接的C++库,它们实现了Platform命名空间.如果程序员必须编写传统的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++代码是否使用了verboten api函数,这种函数过快地耗尽电池或违反了沙盒限制.
ref class然而,包装器必须进行重大调整.没有什么理由认为这将是一个主要障碍,它仍然可能在结构上相似.最大的限制是缺乏对实现继承的支持,COM限制以及必须将使用.NET Framework类型的代码替换为等效的C++代码.典型的挂起是它往往有很多,原始作者通常会喜欢非常方便的.NET类型而不是标准的C++库类型.因人而异.
| 归档时间: |
|
| 查看次数: |
1231 次 |
| 最近记录: |