zurück zum Artikel

Microsoft hilft beim Zugriff auf die Win32-API aus C#, Rust und Co.

Rainald Menge-Sonnentag

(Bild: Primakov/Shutterstock.com)

Ü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.

Die im GitHub-Repository des Projekts [1] unter MIT-Lizenz verfĂŒgbaren Metadaten entsprechen laut Microsoft dem ECMA-335-Standard [2] 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 [3] 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 [4] 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 [5] 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 [6]. 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 [7], 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 [8] lassen sich VorschlĂ€ge beziehungsweise WĂŒnsche fĂŒr die Anbindung zusĂ€tzlicher Programmiersprachen einbringen.

(rme [9])


URL dieses Artikels:
https://www.heise.de/-5032816

Links in diesem Artikel:
[1] https://github.com/microsoft/win32metadata
[2] https://www.ecma-international.org/publications-and-standards/standards/ecma-335/
[3] https://blogs.windows.com/windowsdeveloper/2021/01/21/making-win32-apis-more-accessible-to-more-languages/
[4] https://github.com/dotnet/pinvoke
[5] https://github.com/microsoft/cppwinrt
[6] https://github.com/retep998/winapi-rs
[7] https://github.com/microsoft/cppwin32
[8] https://github.com/microsoft/win32metadata/issues
[9] mailto:rme@ix.de