写点什么

可供 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:351159
用户头像

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

关注

评论

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

非IT行业大企程序员讲述MIS系统开发案例

Philips

Java 企业信息化 .net core 计算机程序设计艺术 企业开发

Axure导出为PDF

波菠菜

MySQL如何快速插入数据

Simon

MySQL 数据库

一个人的精益

escray

学习 面试

ARTS 打卡第四周(200601-200607)

老胡爱分享

ARTS 打卡计划

企业信息化到底重不重要?

代码制造者

低代码 零代码 信息化 编程开发 运营管理

朱嘉明 算力革命背后是分配制度革命 没有算力就没有未来

CECBC

区块链 数字货币 数字经济

Redis追命连环问,你能回答到第几问?(上)Redis简介,数据类型及缓存雪崩缓存击穿缓存穿透

大柚子

Java redis 缓存 面试 后端

Truncate用法详解

Simon

MySQL

区块链交易所系统开发内容,数字货币交易所搭建

13530558032

高频面试题——你真的搞懂物理内存与虚拟内存了吗

大柚子

操作系统 内存管理 虚拟内存 物理内存

JeecgBoot手记

卧石漾溪

巧用SQL拼接语句

Simon

MySQL sql

浅谈备受开发者好评的.NET core敏捷开发工具,讲讲LEARUN工作流引擎

Learun

工作流 开发工具 计算机程序设计艺术 表单

一文讲透布隆过滤器

架构精进之路

布隆过滤器

小米的护城河

石云升

小米 护城河

ARTS挑战打卡第五周(200608-200614)

老胡爱分享

ARTS 打卡计划

ARTS挑战打卡第六周(200615-200621)

老胡爱分享

ARTS 打卡计划

用科学的方法理解每日优鲜

石云升

新零售 每日优鲜 多快好省 科学分析

ARTS 挑战打卡第九周(200706-200712)

老胡爱分享

ARTS 打卡计划

程序员不愿996,创建6个涉黄平台,涉案5000余万元!

程序员生活志

程序员

从雕像到肖像画,这位设计师用 GAN 和 PS 复原了他眼中的古罗马皇帝「群像」

程序员生活志

ARTS 打卡第二周(200518-200524)

老胡爱分享

ARTS 打卡计划

马方业:区块链就是新未来 区块链就是新财富

CECBC

区块链 新未来 新财富

深圳区块链支付系统开发,USDT支付系统服务商

13530558032

ARTS 打卡第三周(200525-200531)

老胡爱分享

ARTS 打卡计划

ARTS挑战打卡第八周(200629-200705)

老胡爱分享

ARTS 打卡计划

教你用SQL实现统计排名

Simon

MySQL

定时任务最简单的3种实现方法(超实用)

王磊

Java 定时任务

交易所合约跟单开发方,数字资产合约跟单系统搭建

13530558032

ARTS 挑战打卡第七周(200622-200628)

老胡爱分享

ARTS 打卡计划

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