Win32metadata 和对应的 WIN32 语言项目已可在 GitHub 上预览

来源: 投稿
作者: 御坂弟弟
2021-01-23 08:13:29

目前,微软开源的 win32metadata 项目和对应的 WIN32 语言项目已可在 GitHub 预览。

众所周知,Win32 API 提供了强大的应用开发功能,然而官方只有 C 和 C++ 版本,其他语言,比如 C# 和 Rust,则需要包装或绑定才能访问这些 API。 这要求开发人员手工包装或绑定,所以容易出错,并且难以扩展。为了解决这一问题,微软创建了 win32metadata 项目并开源。

win32metadata 项目的目标是在元数据中提供 Win32 API 的完整描述,以便用自动方式将其投影到任何语言,从而提高准确性并最大程度地减少维护开销。该项目的输出是兼容 ECMA-335 的 Windows 元数据文件(winmd),并且发布到 Nuget.org,其中包含描述整个 Win32 API 的元数据。通过在开源社区中开发此工具,现在已经催生了多个语言项目。

C#/Win32

C#/Win32 项目由 .NET 上 PInvoke 项目的所有者 Andrew Arnott 合作构建,它解析元数据并生成调用所需 API 的 P/Invoke 包装器。首先从 NuGet.org 添加对Microsoft.Windows.CsWin32 包的引用,然后将一个包含要调用的 Win32 函数的列表的 NativeMethods.txt 文件添加到项目的根目录,该文件每行可以包含一个函数、BCrypt.* 之类的通配符来包含整个模块。

Rust/Win32

Rust/Win32 项目遵循 C++/WinRT 建立的传统,即使用标准语言和编译器为 Windows 构建语言投影,从而为 Rust 开发人员调用 Windows API 提供了自然而习惯的方式。该项目没有按技术对 Windows API 进行划分,而是提供一种调用任何 Windows API 的方法,与底层技术无关。Rust 开发人员可以无缝使用基于C样式导出,COM 接口或 WinRT 类型的 API。 

mod bindings {
    ::windows::include_bindings!();
}

use bindings::{
    windows::data::xml::dom::*,
    windows::win32::system_services::{CreateEventW, SetEvent, WaitForSingleObject},
    windows::win32::windows_programming::CloseHandle,
};

fn main() -> windows::Result<()> {
    let doc = XmlDocument::new()?;
    doc.load_xml("<html>hello world</html>")?;

    let root = doc.document_element()?;
    assert!(root.node_name()? == "html");
    assert!(root.inner_text()? == "hello world");

    unsafe {
        let event = CreateEventW(
            std::ptr::null_mut(),
            true.into(),
            false.into(),
            std::ptr::null(),
        );

        SetEvent(event).ok()?;
        WaitForSingleObject(event, 0);
        CloseHandle(event).ok()?;
    }

    Ok(())
}

除了 C# 和 Rust,Modern C++/Win32 项目也在 GitHub 上开发中。这些项目仍处于早期预览状态,并且正在开源社区的帮助下积极开发。正如微软所言,使 Win32 API 更易用于更多语言,将为 Windows 开发人员提供巨大帮助。"Making Win32 APIs more accessible to more languages will allow developers to make the most out of Windows regardless of their preferred language. We are excited to engage with the community to expand API coverage and language support and minimize the maintenance overhead of existing projects."

展开阅读全文
点击加入讨论🔥(7) 发布并加入讨论🔥
本篇精彩评论
Make Win32 great again?😂😂😂
2021-01-23 22:10
4
举报
微软把Rust当干儿子了?
2021-01-23 08:27
1
举报
7 评论
12 收藏
分享
返回顶部
顶部