AI 年度盘点与2025发展趋势展望,50+案例解析亮相AICon 了解详情
写点什么

可供 C#和 Visual Basic 调用的 WinRT API

  • 2011-09-20
  • 本文字数:1249 字

    阅读完需:约 4 分钟

尽管我们可以使用.NET 语言来调用 Win32 API,但那样做会很困难。所以在过去的两年间微软一直在构建替代的方案,它就是实现了跨语言支持的 Windows 运行时,即 WinRT。我们可以在 C++ 和.NET 中创建 WinRT 组件,并且可由二者以及 JavaScript 使用。

尽管 COM 在表面上是一种基于 OOP 的框架,但它与.NET 之间有很大的区别。在 WinRT 出现之前,COM 是基于接口而不是基于类的。这意味着其中缺少很多.NET 开发者认为应该有的内容,像构造函数以及静态方法等。 C++ 组件扩展解决了这个问题。

WinRT 形式的 COM 使用的元数据格式和通用语言运行时(Common Language Runtime)相同。这些信息存储在表示结构的 WINMD 文件中,尽管没有实现,但在所有公有类中都会有。FXCop 被用于检验这些文件所暴露的 API 是否遵循.NET Framework 的设计指南。

.NET 在最开始时就有“API 设计委员会(API Design Board)”。受此启发,Windows 运行时也会建立 API 设计委员会来对其进行管理。很多最初的成员都在.NET 委员会中,并且很多指南都直接来自于.NET 基本类库所遵循的原则。

Windows 运行时会返回 HRESULT,而不会抛出异常。对于众所周知的 HRESULT 值来说,会抛出相应的异常,而对于其他值就只能抛出 COMException。

WinRT 的 IAsyncOperation 接口现在使用新的 async/await 关键字,就像.NET 的 Task 对象一样。

所有 Windows 运行时的集合接口都被映射到.NET 框架的等价物上。在.NET 4.5 中添加了 IReadOnlyList 和 IReadOnlyDictionary,用来负责处理 WinRT 中的只读集合。

WinRT 和.NET API 在两个地方无法匹配。WinRT 的 stream 无法直接与.NET 的 IO.Stream 类兼容,但是可以调用名为 AsStream 的扩展方法来进行转换。WinRT 还拥有名为 IBuffer 的接口,这在.NET 中也无法简单地实现。在此也有一个扩展方法来进行 IBuffer 和比特数组之间的转换。

我们可以使用 C#和 VB 来创建新的 Windows 运行时程序库,过程非常简单。为了把类暴露为 Windows 运行时组件,我们只需要把项目类型设置为“WINMD 文件”,并确保遵循以下规则:

  1. API 签名只使用 Windows 运行时的类型
  2. 结构体只能拥有公有的数据字段
  3. 只允许对 XAML 控件使用继承,其它类型都必须使用 sealed 关键字。
  4. 只支持内建的泛型

编译这些库之后,我们就可以在 C++ 和 JavaScript 中调用它们,就像从.NET 中调用一样简单。

警告

由于 WinRT 是基于 COM 构建的,所以你同样会有引用计数和 mark-and-sweep 垃圾回收器之间无法融合的问题。对于实现了析构函数释放非内存资源的对象来说,这是最常见的问题。我们可以考虑调用“Marshal.FinalReleaseComObject”来解决问题,但是那本身也存在问题。

COM 风格的 marshaling 需要在.NET 和本地组件之间调用。尽管这通常是无关紧要的,但是如果 API 非常不正式,那么就会出现问题。

内建的 WinRT 库(而不是 XAML)是在 Metro 运行时环境之外提供的。然而,第三方的 WinRT 库并非如此。这是 WinRT 中激活框架(activation framework)的限制,而不是.NET 的问题。

查看英文原文: C# and Visual Basic on the WinRT API

2011-09-20 09:35978
用户头像

发布了 340 篇内容, 共 129.9 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

AI与众包平台共铸新机遇

知者如C

生成式AI助力智能未来

百度开发者中心

#人工智能 ChatGPT 生成式AI 文心一言

低成本生成式AI技术:推动AI普及的关键

百度开发者中心

医疗 #人工智能 ChatGPT 文心一言

头脑风暴小工具-影响地图

Bruce Talk

敏捷开发 Agile Product Owner 影响地图

2023 年如何将您的应用提交到 App Store

雪奈椰子

ios 开发 Windows ios 开发证书

在数字化时代的挑战与解决:跨国大文件传输方法

镭速

大文件跨国传输 跨国快速传输大文件

有奖活动 | 以代码之名,写出对Ta的爱

HarmonyOS开发者

HarmonyOS

死锁产生的条件及解决方法

红袖添香

Java 多线程 死锁

分布式数据库架构:高可用、高性能的数据存储

互联网工科生

分布式数据库 高性能 高可用性

蚂蚁安全实验室登上全球白帽黑客最高领奖台

科技热闻

华为云GaussDB打造最可信的数据库,给世界一个更优选择

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 8 月 PK 榜

ETL 小技巧:文件输出插件数据写入空闲时间阈值配置及作用

大河

缓冲区 ETL bboss 文件输出

和鲸 × 临床医学丨“人”作为一生命体在 AI for Science 过程中的作用与交互

ModelWhale

数据科学 临床医学 AI for Science 交叉学科 临床研究

生成式AI技术市场现状与发展前景展望

百度开发者中心

#人工智能 生成式AI 文心一言

生成式AI:内容创作新革命

百度开发者中心

自然语言处理 内容 #人工智能 文心一言

生成式AI引领未来传媒业发展趋势

百度开发者中心

媒体 #人工智能 生成式AI 文心一言

用案例带你认识决策树,解锁洞察力

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 8 月 PK 榜

《守望先锋 2》性能提升高达33%!英特尔锐炫从未止步

E科讯

​Elastic Stack最佳实践系列:Beats->ES,一个更轻型的架构选择

腾讯云大数据

ES

电脑的配置对仿真软件的分析速度有影响吗?

思茂信息

硬件 仿真软件 电脑硬件 有限元分析 电脑配置

技术领先的用友iuap平台,助力升级数智化底座、驾驭数智未来

用友BIP

2023全球商业创新大会

生成式AI:全球科技革命的驱动力

百度开发者中心

教育 #人工智能 ChatGPT 生成式AI

盘点!3月份Github上“最热门”的开源项目

java易二三

Java 程序员 Vue 前端 计算机

Lightroom下载 图像处理软件Lightroom Classic 2023 mac完美激活版

mac

苹果mac Windows软件 Lightroom Classic 2023 lrc2023 数字图像处理软件

生成式AI助力高效写作

百度开发者中心

大模型 #人工智能 ChatGPT 生成式AI

容器化微服务:用Kubernetes实现弹性部署

高端章鱼哥

Kubernetes 微服务 容器化

第三周作业

大肚皮狒狒

带你读论文丨Fuzzing漏洞挖掘详细总结 GreyOne

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 8 月 PK 榜

企业国际大数据传输必须了解的5种跨国快速传输大文件工具

镭速

大文件传输 跨国传输大数据

电脑硬件迭代快,对仿真软件有什么影响?

智造软件

仿真软件 电脑硬件 结构仿真 电脑配置 硬件配置

可供C#和Visual Basic调用的WinRT API_.NET_Jonathan Allen_InfoQ精选文章