Microsoft has expanded the scope of Win32 APIs beyond support for C and C++, with added support for C# and Rust through the win32metadata project now available in preview on GitHub. Other languages will follow, according to the Windows development team.
Previously, developers using languages other than C and C++ had to use wrappers or bindings in order to access these APIs, which increases the chances of an error and doesn’t scale to broad API coverage, according to Microsoft.
This has prompted several community projects to try to provide a more strongly typed and idiomatic representation of those wrappers and bindings to provide an improved developer experience such as PInvoke for .NET and winapi-rs for Rust.
However, since these projects are all manually maintained, the Windows SDK team said it started its own version to take some of the burden off of the community.
“The goal of the win32metadata project is to provide a complete description of the Win32 API surface in metadata so that it can be projected to any language in an automated way, improving correctness and minimizing maintenance overhead,” the Windows SDK team wrote in a blog post.
The project is an ECMA-335 compliant Windows metadata file (winmd) that was published to NuGet.org.
The first such language projection is C#/Win32,which parses the metadata and generates P/Invoke wrappers that are required to call APIs. Developers just have to add a reference to the Microsoft.Windows.CsWin32 package from NuGet.org and add the file NativeMethods.txt to the root of their project with a list of the Win32 functions that they want to call.
“C#/Win32 provides rich Intellisense, strong types for parameters, and also includes the relevant documentation from docs.microsoft.com, all dynamically generated from metadata based on the APIs you request,” the Windows team explained. “No additional dependencies are required, broad API coverage is achieved with improved correctness and minimal maintenance overhead, and the APIs are expressed idiomatically as C# developers would expect.”
Meanwhile, the Rust language projection follows the C++/WinRT of building language projections for Windows and the windows crate lets developers call APIs just like they do for any other Rust module.
The team is also working on adding the Modern C++ projection on GitHub and welcoming community contributions there. Other languages will follow base on popular demand.