Microsoft hilft beim Zugriff auf die Win32-API aus C#, Rust und Co.
Über das win32metadata-Projekt lässt sich die Win32-API einheitlich aus Sprachen wie C# oder Rust ansprechen.
Microsoft hat auf GitHub das Projekt win32metadata veröffentlicht, das einen einheitlichen Zugriff auf die Win32-API aus Programmiersprachen jenseits von C und C++ ermöglichen soll. Es handelt sich wohlgemerkt nicht um eine Offenlegung des zugehörigen Windows-Codes, sondern um einheitliche Metadaten zum Zugriff auf die APIs.
Win32 ist die 32-bit-API zum Zugriff auf die Windows-Funktionen und von Haus aus auf das Zusammenspiel mit C und C++ ausgelegt. Für den Zugriff aus anderen Programmiersprachen wie Rust oder C# ist eine zusätzliche Schicht in Form eines Wrappers beziehungsweise durch Bindings erforderlich.
Einheitliche Metadaten fĂĽr individuelle Projektionen
Die im GitHub-Repository des Projekts unter MIT-Lizenz verfügbaren Metadaten entsprechen laut Microsoft dem ECMA-335-Standard für die Common Language Infrastructure (CLI). Die zugehörige winmd-Datei mit der Beschreibung der Win32-API-Oberfläche lässt sich über Nuget.org beziehen.
Zum Start ist die Beschreibung laut dem Blogbeitrag zur Veröffentlichung nicht vollständig. Das GitHub-Repository dient der öffentlichen Weiterentwicklung, die eine akkurate Repräsentation der Schnittstelle sicherstellen soll. Zur Integration in andere Programmiersprachen sind individuelle Projektionen erforderlich.
C# und Rust im Boot
Die C#-Projektion C#/Win32 entstand in Zusammenarbeit mit dem Betreiber des PInvoke-Projekts, das den Zugriff aus Microsofts Programmiersprache auf diverse Betriebssysteme bietet. Das zugehörige GitHub-Repository verweist für die Win32-Anbindung auf die Integration in das Win32-Metadaten-Projekt.
Zum Einbinden in eigene Projekte mĂĽssen Entwicklerinnen und Entwickler eine Referenz zum NuGet-Paket Microsoft.Windows.CsWin32
angeben und eine Datei mit dem Namen "NativeMethods.txt" ins Wurzelverzeichnis ihres Projekts einfĂĽgen, in das sie die aufzurufenden Win32-Methoden eintragen. Dabei sind Wildcards wie in BCrypt.*
zum Nutzen vollständiger Module erlaubt. C#/32 erstellt zu den Methoden die passenden Wrapper.
Die Rust-Projektion hat die C++ Language Projection für die Windows Runtime C++/WinRT als Vorbild. Zur Anbindung an die Win32-API existiert eine Crate, wie die über den Paketmanager Cargo verwalteten Packages bei Rust heißen. Zum Einbinden muss sie in den Abhängigkeiten des Projekts definiert sein:
[dependencies]
windows = "0.2.1"
[build-dependencies]
windows = "0.2.1"
Weniger Handarbeit und mehr C++
Zwar existierte für Rust analog zu der für C# genannten PInvoke-Integration ein unabhängig von Microsoft betriebenes Open-Source-Projekt zur Anbindung mit dem Projektnamen winapi-rs. Die Betreiber solcher Projekte mussten jedoch bisher die Schnittstellenbeschreibungen und API-Wrapper manuell pflegen. Das win32metadata-Projekt trennt dagegen die Beschreibung von der Umsetzung für individuelle Programmiersprachen, sodass Ergänzungen in den Metadaten ohne manuelle Anpassung in die individuellen Projektionen einfließen.
Dass Microsoft an einer Umsetzung für C++ arbeitet, erscheint nur auf den ersten Blick widersprüchlich – schließlich ist die Win32-API auf C++ ausgelegt. Allerdings soll die Projektion aktuelle C++-Standards, insbesondere ab C++17, berücksichtigen und langfristig auf das in C++20 eingeführte Modulsystem vorbereiten.
Über die Issues-Seite des Projekts lassen sich Vorschläge beziehungsweise Wünsche für die Anbindung zusätzlicher Programmiersprachen einbringen.
(rme)