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.

Lesezeit: 2 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 22 Beiträge

(Bild: Primakov/Shutterstock.com)

Von
  • Rainald Menge-Sonnentag

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.

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.

Der .NET-Assembly-Browser ILSpy listet die in winmd beschriebenen Win32-APIs auf.

(Bild: Microsoft)

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.

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.

Nach dem Einbinden lassen sich die Win32-Funktionen direkt aus C#-Programmen ansprechen.

(Bild: Microsoft)

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"

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)