写点什么

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

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

关注

评论

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

万物皆可集成系列:低代码对接阿里物流API实现快递跟踪

葡萄城技术团队

前端 低代码 电商 API

Microsoft Project怎么使用?

爱吃小舅的鱼

一个疯子居然获得北京市科学技术奖?

青藤云安全

青藤云安全 北京科学技术奖

云原生机甲,真正的服务网格

如水

云原生 servicemesh 云原生机甲 CloudMecha

Spring之控制反转

Andy

低代码在企业数字化转型中有什么价值?

SoFlu软件机器人

华为云桌面,随时随地助力企业轻松办公

科技怪授

华为云桌面

为什么说网络安全行业是IT行业最后的红利?

网络安全学海

网络安全 安全 信息安全 渗透测试 WEB安全

【网易云信】Sanitizers 系列之 Sanitizers 概述

网易智企

运维 服务器

跨区域传输数据不够流畅?华为云连接CC了解一下

科技怪授

华为云链接

Spring之资源读取

Andy

Spring Framework框架简介

Andy

华为云连接CC,助力企业一站式解决跨区域传输难问题

科技怪授

华为云CC链接

拒绝“内鬼式”数据泄露,安全内控如何构建?

极盾科技

重磅 | 青藤蜂巢入围领导者象限,增长指数&综合竞争力第一!

青藤云安全

主机安全 青藤云安全

顶会最强的前20%!电影情感效应预测论文拿下ACMMM Oral收录!

阿里巴巴文娱技术

人工智能 情感计算

Go语言入门08—函数

良猿

Go golang 后端 10月月更

Apache IoTDB v0.13.3 发布!

Apache IoTDB

数据库 Apache IoTDB

、作用域链和它的一些优化

hellocoder2029

JavaScript

用Js怒刷LeetCode

Geek_07a724

JavaScript LeetCode

太全!不愧是Github爆火的阿里812页高并系统设计核心技术全解

程序员小毕

程序员 架构 程序人生 后端 高并发

软件测试面试真题 | Pytest 的内置 fixture 有哪些?

测试人

面试 软件测试 测试开发 测试流程

用javascript分类刷leetcode3.动态规划(图文视频讲解)

js2030code

JavaScript LeetCode

Sanitizers 系列之 Sanitizers 概述

网易云信

运维 服务器

Spring之依赖注入

Andy

软件测试 | 测试开发 | 校招面试真题 | 测试流程大概是什么?

测吧(北京)科技有限公司

测试

Spring面试题(部分)

Andy

官宣:新功能正式上线!

青藤云安全

主机安全 青藤云安全 青藤智库

Spring Boot「17」数据库连接池

Samson

Java spring 学习笔记 spring-boot 10月月更

js函数式编程讲解

hellocoder2029

JavaScript

企业如何建立数据分类分级制度

极盾科技

数据安全 数据分类分级

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