加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

通用Windows平台应用程序和C/C++LI(VS 2015 RC1)

发布时间:2020-12-14 04:11:17 所属栏目:Windows 来源:网络整理
导读:我有一些C/C++LI代码,它们源自.NET系统命名空间类. 有没有办法将此代码重用于通用Windows平台应用程序? 我无法在C中获得对系统命名空间的引用,但在C#中它是可能的.看起来只支持C/C++x代码而不支持托管C/C++LI. C/C++X扩展的语法和关键字类似于C/C++LI.但这
我有一些C/C++LI代码,它们源自.NET系统命名空间类.

有没有办法将此代码重用于通用Windows平台应用程序?

我无法在C中获得对系统命名空间的引用,但在C#中它是可能的.看起来只支持C/C++x代码而不支持托管C/C++LI.

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

这是您无法使用System命名空间的基本原因,它是.NET命名空间.您可以使用std命名空间以及WinRT特定类型的Platform和Windows命名空间.编译器无法使用有效的/ ZW编译选项导入.NET引用程序集,只能导入具有.winmd文件扩展名的WinRT元数据文件.这是COM .tlb类型库文件格式的扩展,您以前必须使用#import指令导入它们.

这本身就是混淆的另一个主要来源,内部.winmd文件格式基于.NET元数据的格式.因此,大多数.NET反编译器都会向您显示.winmd文件的内容.但同样只是表面上的相似之处,它与.NET程序集完全无关.它只能包含声明,而不是代码.最好将它与您在本机C项目中使用的.h文件进行比较.或者.tlb文件,如果您以前曾接触过COM.

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

WinRT很容易支持用C#或VB.NET等托管语言编写的代码,语言投影内置于框架中并且非常不可见.但不是C/C++LI,这是一个结构性限制. Store / Phone / Universal应用程序面向名为.NETCore的.NET Framework子集.最近知道CoreCLR是开源的部件.哪个不支持模块初始化程序,对C/C++LI至关重要.

足够的介绍和答案:不,你没有使用你的C/C++LI代码,你将不得不重写它.只要它遵守api限制,您就可以轻松移植C/C++LI包装器所连接的本机C代码.你应该首先从那里开始,因为它很容易做,并立即告诉你你的本机C代码是否使用verboten api函数,那种电池耗尽太快或违反沙箱限制.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读