写点什么

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

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

    阅读完需:约 4 分钟

AI 大模型超全落地场景&金融应用实践,8 月 16 - 19 日 FCon x AICon 大会联诀来袭、干货翻倍!

尽管我们可以使用.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:35893
用户头像

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

关注

评论

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

开源一夏|OpenHarmony如何查询设备类型(eTS)

坚果

开源 HarmonyOS OpenHarmony 8月月更

手写柯里化 - toString 理解

掘金安东尼

JavaScript 前端 函数式 8月月更

【LeetCode】最大层内元素和Java题解

Albert

LeetCode 8月月更

STM32+ULN2003驱动28BYJ4步进电机(根据圈数正转、反转)

DS小龙哥

8月月更

2000多字教你三招在Linux中找出大文件,最后一个命令简直太简单了!

wljslmz

Linux 签约计划第三季 8月月更

双因子与多因子身份验证有什么区别?

SEAL安全

身份验证

前端常考react相关面试题(一)

helloworld1024fd

React

入门 Polkadot 平行链开发,看这一篇就够了

One Block Community

区块链

Go编译原理系列6(类型检查)

书旅

Go 源码 后端

IO流篇 -- 基于io流实现文件夹拷贝(拷贝子文件夹及子文件夹内文件)满满的干货

Bug终结者

Java static 8月月更

高质量 DeFi 应用构建指南,助力开发者玩转 DeFi Summer

TinTinLand

区块链

告白数字化转型时代:麦聪软件以最简单的方式让企业把数据用起来

雨果

数字化转型

语音社交软件开发——充分发挥其价值

开源直播系统源码

软件开发 直播系统源码 语音聊天

牛刀小试基本语法,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang基本语法和变量的使用EP02

刘悦的技术博客

golang 语言 语言 & 开发 教程分享 #go

秘乐短视频挖矿系统开发详情

开发微hkkf5566

即刻报名|Apache Kylin X Apache DolphinScheduler:大数据底座的构建和展望

Kyligence

数字化转型 数字分析 数据调度

mysql进阶(二十七)数据库索引原理

No Silver Bullet

MySQL 聚集索引 8月月更 非聚集索引 覆盖索引

面试点:Java 中 hashCode() 和 equals() 的关系

TimeFriends

8月月更

DFINITY 基金会创始人谈熊市沉浮,DeFi 项目该何去何从

TinTinLand

区块链

数据中台建设(十):数据安全管理

Lansonli

大数据 数据中台 8月月更

电竞、便捷、高效、安全,盘点OriginOS功能的关键词

Geek_2d6073

长达四年的减肥记录

Amazing_eve

#开源

JS逆向入门学习之回收商网,手机号码简易加密解析

梦想橡皮擦

Python 爬虫 8月月更

创建一个 Dapp,为什么要选择波卡?

One Block Community

区块链

全国独家 | 上海线下面授大规模敏捷LeSS认证 | 2022年12月8-10日

ShineScrum捷行

less 大规模敏捷 LeSS认证 大规模敏捷LeSS

深入理解 Istio 流量管理的超时时间设置

万猫学社

云原生 istio envoy Istio流量管理

RT-Thread记录(一、RT-Thread 版本、RT-Thread Studio开发环境 及 配合CubeMX开发快速上手)

矜辰所致

RT-Thread 8月月更

企业的数字化转型到底是否可以买来?

雨果

数字化转型

HDD杭州站•ArkUI让开发更灵活

HarmonyOS开发者

HarmonyOS

这份阿里强推的并发编程知识点笔记,将是你拿大厂offer的突破口

了不起的程序猿

数据库 高并发 java程序员 大厂面试 java;

导火索:OAuth 2.0四种授权登录方式必读

知识浅谈

8月月更

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