Rendre les API Win32 plus accessibles à un plus grand nombre de langages
Les API Win32, quésaco ? Les API Win32 offrent des fonctionnalités puissantes que tous les langages et frameworks ne prennent pas en charge eux-mêmes qui vous permettent de tirer le meilleur parti de Windows dans vos applications. Lors du développement pour Windows, les développeurs font souvent appel aux API Win32 pour accéder à ces fonctionnalités. Bien que ces API sont facilement accessibles aux développeurs C et C++, d'autres langages comme C# et Rust nécessitent des wrappers ou des bindings pour pouvoir y accéder. En C#, cela est communément appelé platform invoking ou P/Invoke.
Selon Microsoft, historiquement, cette façon de faire nécessite de redéfinir manuellement les API pour les rendre accessibles, ce qui est fragile et sujet à des erreurs. Ainsi, étant donné la forte demande d'appel d'API Win32 à partir de divers langages, des projets communautaires tels que"https://github.com/dotnet/pinvoke" (.NET) et "https://github.com/retep998/winapi-rs" (Rust) ont pris en charge la charge de fournir des signatures d'API fortement typées et validées pour leurs frameworks, mais les projets sont maintenus manuellement, ce qui est difficile à maintenir et rend difficile la fourniture d'une couverture API complète.
Pour simplifier et automatiser le processus, Microsoft a présenté ce 21 janvier son projet win32metadata, et quelques projections initiales du langage Win32. Ce projet vise à fournir des métadonnées pour les API Win32 de sorte que les projections idiomatiques et les projets puissent être générés pour tous les langages et frameworks de manière plus automatisée et avec une couverture API plus complète. Pour rappel, une projection de langage de programmation est un sous-système diversement décrit comme un ensemble de wrappers ou un adaptateur (adapter).
Ce sous-système favorise le développement en utilisant les API d'une plateforme (Win32 dans ce cas) de manière naturelle et familière pour le langage cible. « En tant que propriétaires du SDK Windows, nous voulions voir où nous pourrions apporter une valeur ajoutée unique, soulager la communauté et faire de la couverture large et durable des API dans les différents langages une réalité. Le résultat est notre projet win32metadata et les projections correspondantes du langage Win32 à présent en avant-première sur GitHub », a déclaré Microsoft jeudi dans un billet de blogue.
Microsoft ouvre les anciennes API Win32 à C# et à Rust, d'autres langages à venir
Selon Microsoft, le projet de métadonnées (win32metadata) facilite la création de projections de langage en fournissant une description complète de la surface de l'API Win32 afin qu'elle puisse être automatiquement projetée vers n'importe quel langage, ce qui améliore la précision et minimise la maintenance. Ainsi, ces descriptions de métadonnées ne sont pas destinées à être consommées directement par les développeurs, qui utiliseront plutôt les projections de langage qui, à leur tour, consomment les métadonnées et projettent les API dans les modèles naturels de langages spécifiques.
« Les API Win32 existent depuis longtemps, donc les décrire toutes avec précision demandera un peu d'itération », a expliqué Microsoft. « Nous allons développer cet outil de manière ouverte et nous accueillons les contributions de la communauté afin de garantir une représentation précise de la surface de l'API Win32 qui profitera à tous les langages ». En attendant, Microsoft a présenté en avant-première deux premières projections de langages :
- C#/Win32
Construit en partenariat avec Andrew Arnott, le propriétaire du projet PInvoke pour .NET, C#/Win32 analyse les métadonnées et génère les wrappers P/Invoke nécessaires pour appeler les API qui vous intéressent. Il suffit d'ajouter une référence au paquet Microsoft.Windows.CsWin32 de NuGet.org et d'ajouter un fichier appelé NativeMethods.txt à la racine de votre projet avec une liste des fonctions Win32 que vous souhaitez appeler. Le fichier peut contenir une fonction par ligne ou même des jokers comme BCrypt.* pour inclure des modules entiers.
Une fois rempli, C#/Win32 générera les wrappers P/Invoke pour les fonctions que vous demandez et toutes leurs dépendances. Microsoft a déclaré que C#/Win32 n'est qu'un premier exemple de ce qui est possible avec des projections d'API Win32 créées dynamiquement. « Nous envisageons de telles projections pour de nombreux langages, tous exprimant des API Win32 selon les modèles idiomatiques que les développeurs du langage attendent », a déclaré la firme de Redmond.
- Rust for Windows
D'après le billet de blogue de Microsoft, la projection du langage Rust s'inscrit dans la tradition établie par C++/WinRT de construire des projections de langage pour Windows en utilisant des langages et des compilateurs standard, offrant aux développeurs Rust un moyen naturel et idiomatique d'appeler les API Windows. La caisse Windows vous permet d'appeler n'importe quelle API Windows en utilisant du code généré à la volée directement à partir des métadonnées, ce qui vous permet d'appeler les API comme si elles n'étaient qu'un autre module Rust.
Elle (la projection du langage Rust) ne tente pas de partitionner les API Windows par technologie, mais fournit plutôt un moyen unique d'appeler n'importe quelle API Windows, quelle que soit la technologie sous-jacente. Vous pouvez utiliser de manière transparente les API basées sur des exportations de type C, des interfaces COM ou des types WinRT.
- Autres langages
En plus de C# et de Rust, Microsoft travaille également sur une projection en C++ moderne dont les sources sont accessibles sur GitHub et invite les développeurs à le rejoindre pour peaufiner win32metadata. Ces projets sont des avant-premières et sont en cours de développement actif. Ils sont donc susceptibles d'être modifiés de manière significative à mesure que Microsoft absorbe les commentaires et qu'il progresse. L'entreprise a annoncé travailler avec la communauté pour soutenir d'autres langages en fonction de la demande, en s'associant à des projets communautaires existants le cas échéant. En créant davantage de projections de langages, la société a déclaré qu'elle suivrait ces principes :
- les projections de langages doivent fournir une couverture API maximale ;
- les projections de langages devraient fournir des adaptations conviviales des API et des types, le cas échéant ;
- les projections de langages doivent fournir IntelliSense provenant de la documentation officielle ;
- les projections de langages doivent permettre de filtrer les API disponibles en fonction de la version du SDK qu'un projet cible ;
- les projections de langages devraient permettre aux développeurs de cibler un ensemble spécifique d'API et de lier ou d'inclure uniquement les artefacts nécessaires pour fournir un support à ces API.
Sources : Microsoft, Page GitHub de win32metadata
Et vous ?
Que pensez-vous du projet win32metadata ?
Voir aussi
Microsoft annonce Rust/WinRT, une projection du langage Rust pour les API Windows Runtime implémentée comme une bibliothèque basée sur des fichiers d'en-tête
Le langage Rust est la meilleure chance offerte à l'industrie informatique pour la mise sur pied d'applications système sécurisées, d'après Microsoft
Après Microsoft et Linux, c'est au tour d'Apple de montrer de plus en plus d'intérêt pour l'utilisation de Rust dans la programmation de bas niveau
L'équipe Microsoft Security Response Center recommande l'utilisation de Rust comme approche proactive pour un code plus sécurisé