使Win32 API更易于访问更多语言

2021-01-24 12:24:25

Win32 API提供了强大的功能,可让您在应用程序中充分利用Windows。虽然C和C ++开发人员可以轻松访问这些API,但其他语言(如C#和Rust)则需要包装或绑定才能访问这些API。在C#中,这通常称为平台调用或P /调用。

从历史上看,这要求开发人员手工包装或绑定,这很容易出错,并且无法扩展到广泛的API覆盖范围。近年来,由于强烈要求从各种语言调用Win32 API,因此催生了几个社区项目,以提供这些包装和绑定的更强类型和惯用的表示形式,以提供改进的开发人员体验,并节省开发人员自己创建它们的开销。一些值得注意的项目包括用于.NET的PInvoke和用于Rust的winapi-rs。

这些项目的主要挑战在于它们是手动维护的,这使得覆盖范围广且持续的API变得困难且成本高昂,而且它们的工作并没有真正使其他语言受益。

作为Windows SDK的所有者,我们希望看到可以在此处提供独特价值的地方,减轻社区的负担,并使跨语言的广泛且可持续的API覆盖成为现实。

结果是我们的win32metadata项目和相应的Win32语言投影现在可以在GitHub上预览了!

win32metadata项目的目标是在元数据中提供Win32 API表面的完整描述,以便可以自动方式将其投影到任何语言,从而提高准确性并最大程度地减少维护开销。该项目的输出实际上是发布到Nuget.org的,兼容ECMA-335的Windows元数据文件(winmd),其中包含描述整个Win32 API表面的元数据。

Win32 API已经存在很长时间了,因此准确描述所有这些API将需要一些迭代。我们将在开放的欢迎社区中开发此工具,以确保Win32 API表面的准确表示,这将使所有语言受益。

为了使元数据能够使开发人员从他们选择的语言中惯用地调用Win32 API,我们需要在其之上构建语言投影。第一个这样的语言投影是C#/ Win32。

Rust语言投影遵循C ++ / WinRT建立的传统,即使用标准语言和编译器为Windows构建语言投影,从而为Rust开发人员调用Windows API提供了自然而惯用的方式。 Windows crate可让您使用直接从元数据中即时生成的代码来调用任何Windows API,从而使您可以像调用其他API一样调用这些API。它不会尝试按技术对Windows API进行分区,而是提供一种调用任何Windows API的单一方法,而与底层技术无关。您可以无缝使用基于C样式导出,COM接口或WinRT类型的API。

除C#和Rust外,我们还在GitHub上公开进行Modern C ++投影,并欢迎社区的贡献。这些项目是早期预览,并且正在积极开发中,因此随着我们吸收反馈并取得进展,它们可能会发生重大变化。我们将与社区合作,根据需求支持其他语言,并在适当情况下与现有社区项目合作。

在win32metadata项目的保护下,我们希望倡导一套原则,所有语言投射都应遵循,以获取最佳开发人员体验,同时为每种投射提供灵活性,以尽其所能为社区带来最大利益。

使Win32 API更易于使用更多语言,这将使开发人员可以充分利用Windows,而无需考虑其首选语言。我们很高兴与社区合作,以扩展API覆盖范围和语言支持,并最大程度地减少现有项目的维护开销。