写点什么

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

2011 年 9 月 20 日

尽管我们可以使用.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 年 9 月 20 日 09:35459
用户头像

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

关注

评论

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

2021户外广告逆袭,还是要靠数字化

󠀛Ferry

6月日更

VSPD9.0基础 建立一对互联的虚拟串口,进行串口通信的测试

万里无云万里天

IoT 6月日更 VSPD

Redis数据结构

邱学喆

数据库 redis 跳跃表

致恰达耶夫,致鸿蒙

脑极体

SMT产线可视化管理,智能工业助力全渠道优化

一只数据鲸鱼

数据可视化 智慧工厂 SMT 智慧工业

一文了解预训练语言模型!

博文视点Broadview

关于第四次财富狂潮的思考,区块链如猛虎出笼?

CECBC区块链专委会

Hello Python! 第一天学 Pyhton 语言

在即

6月日更 六月日更

详解Camtasia的注释功能

淋雨

视频剪辑 Camtasia 录屏

C 语言面向对象的封装方式(示例)

实力程序员

五大新品+两大黑科技,看华为云如何升级基础设施让用户“躺平”

华为云开发者社区

云原生 基础设施 实景三维建模 计算实例C7 分布式云

微博评论的高性能高可用计算架构设计

知莫问

有点难的 webpack 知识点:Dependency Graph 深度解析

范文杰

webpack 六月日更

直击Huawei Mate 40产线背后的华为云IoT智能制造

华为云开发者社区

IoT 数字化转型 数字孪生 华为云IoT

在Spring Bean实例过程中,如何使用反射和递归处理的Bean属性填充?

小傅哥

Java spring 小傅哥 反射调用 属性填充

Dubbo SPI

青年IT男

dubbo

深圳首辆数字人民币主题观光巴士亮相

CECBC区块链专委会

GrowingIO 前端团队对于 GraphQL 的实践总结

GrowingIO技术专栏

前端 graphql

IPFS云算力挖矿系统开发(详情)丨IPFS云算力(源码)案例

系统开发咨询1357O98O718

玩转容器存储QoS

焱融科技

云计算 容器 云原生 QoS 超融合

面试系列-3 限流场景实践

我是阿沐

php lua redis 限流算法 大厂面试经历

实现多级缓存架构设计方案

xcbeyond

缓存 缓存架构 6月日更

中断Hwi:提高鸿蒙轻内核系统实时性及执行效率的秘密武器

华为云开发者社区

鸿蒙 硬件 中断 鸿蒙轻内核 中断信号

React Hooks - 如何安全地使用state

Daniel

前端开发 React React Hooks JavaScrip 6 月日更

BZZ算力挖矿系统开发功能丨BZZ算力挖矿源码设计

系统开发咨询1357O98O718

动态规划(详解矩阵连乘 案例+Java代码实现)

若尘

算法 动态规划 矩阵运算 java代码 六月日更

鸿蒙能成为世界第三的操作系统吗?

小智

华为 鸿蒙 操作系统

GrowingIO Design 组件库搭建之组件开发

GrowingIO技术专栏

组件

“盒模型“初探

编程三昧

CSS css3 前端 盒模型

react源码解析4.源码目录结构和调试

全栈潇晨

React Hooks react源码

【Flutter 专题】114 图解自定义 ACEProgressPainter 对比进度图

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6 月日更

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