【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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

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

关注

评论

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

java面试题

程序员小张

新兴技术诞生,国产操作系统崛起| 社区征文

攻城狮Wayne

操作系统 国产开源 年中技术盘点

代码随想录训练营Day08 - 字符串(上)

jjn0703

深入理解 Python 虚拟机:字节(bytes)的实现原理及源码剖析

EquatorCoco

Python 虚拟机 字节

Monibuca 中的内存复用

不卡科技

GC go语言 流媒体开发 内存池 Monibuca

从头学Java17-Stream API(二)结合Record、Optional

烧霞

Optional java17 Stream API

如何用大模型 Prompt 解决行业场景问题?大厂中文教程来了!

飞桨PaddlePaddle

人工智能 百度 paddle 飞桨

prometheus Histogram 统计原理

蓝胖子的编程梦

Grafana Prometheus #Grafana #Prometheus #监控

AWS云VS阿里云 横向对比

WuKongCoder

云计算 阿里云 AWS EMR

华为云代码托管CodeArts Repo:保护企业核心代码资产安全

华为云PaaS服务小智

云计算 华为云 代码托管 华为开发者大会2023

C++中vector自定义大小方式

攻城狮Wayne

机器学习洞察 | JAX,机器学习领域的“新面孔”

亚马逊云科技 (Amazon Web Services)

机器学习

不容错过的基础设施专场!今天4点,关于全场景质量协同平台T-One的介绍 | 第86-96期

OpenAnolis小助手

开源 基础设施 操作系统 龙蜥大讲堂 T-one

华为云盘古气象大模型研究成果在《Nature》正刊发表

新消费日报

前端开发需要了解的工具集合

树上有只程序猿

用Vue3编写一个简单的组件

互联网工科生

Vue 3 slots

开源数据集成平台SeaTunnel:MySQL实时同步到es

javalover123

同步 数据同步 数据集成 CDC 实时

专利技术系列 001 | 鹏云网络分布式系统脑裂问题解决方案

鹏云网络

云计算 分布式系统 分布式存储 分布式系统脑裂 软件定义存储

JavaScript 函数

猫九

软件测试/测试开发丨Python常用数据结构-集合Set

测试人

Python 程序员 软件测试 测试开发

沙漠觅绿洲——华为HMS生态强势赋能伙伴成功掘金中东非

最新动态

es笔记五之term-level的查询操作

Hunter熊

elasticsearch

Git教学

猫九

git 学习

KaiwuDB 亮相 2023 可信数据库发展大会

KaiwuDB

KaiwuDB 2023可信数据库发展大会

星辰天合公司产品完成阿里云PolarDB数据库产品生态集成认证

阿里云数据库开源

polarDB PolarDB-X PolarDB for PostgreSQL

企业利用bi商业智能工具有哪些改变呢?以瓴羊QuickBI为例

对不起该用户已成仙‖

华为云“盘古气象”登上Nature!

新消费日报

从php5.6到golang1.19-文库App性能跃迁之路

百度Geek说

golang App 百度文库

软件测试 | 测试设计技巧—游戏类

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

测试

直播软件开发知识:实现感知网络质量功能

山东布谷科技

源码 软件 软件开发 直播 源码搭建

文创商城项目实战

猫九

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