Nouvelles Du Monde

Nouveau dans .NET 7.0 [28]: Générateur de source pour l’appel de plate-forme

Nouveau dans .NET 7.0 [28]: Générateur de source pour l’appel de plate-forme

2023-08-25 11:25:00

En plus du générateur de sources pour les expressions régulières abordé dans les deux parties précédentes de cette série, il existe également un nouveau générateur de sources dans .NET 7.0 pour accéder aux fonctions natives du système d’exploitation (terme technique .NET : Platform Invoke, abrégé P/Invoke) .

Publicité


docteur Holger Schwichtenberg est expert technologique en chef chez MAXIMAGO, qui propose un développement de logiciels innovant et basé sur l’expérience, y compris dans des domaines hautement critiques liés à la sécurité. Il est également à la tête du réseau d’experts www.IT-Visions.de, qui soutient de nombreuses moyennes et grandes entreprises avec des conseils et des formations dans le développement et l’exploitation de logiciels avec 38 experts renommés.

Le nouveau générateur de sources s’appelle Microsoft.Interop.LibraryImportGenerator. Il est utilisé via l’annotation [LibraryImport] alternative à l’annotation précédente [DllImport], qui a déclenché la génération de code d’un stub de langage intermédiaire (stub IL) au moment de l’exécution. Cependant, la génération de code d’exécution n’est pas possible en conjonction avec le compilateur anticipé (AOT) abordé dans la partie 17 de cette série.

La liste suivante montre trois exemples d’appels d’API Windows avec le précédent [DllImport]:

/// 
/// 
/// Altes Verfahren
/// [DllImport] erfordert static und extern!
/// 
public static class Win32APIohneSG
{
 [DllImport("User32.dll")]
 public static extern bool MessageBeep(UInt32 beepType);
 
 [DllImport("user32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
 public static extern IntPtr MessageBoxW(int hWnd, string text, string caption, uint type);
 
 // funktioniert auch ohne Zusatz "W" (W steht für Unicode)
 [DllImport("shell32.dll")]
 public static extern int ShellAbout(IntPtr hWnd, string szApp, string szOtherStuff, IntPtr hIcon);
}

Dans la nouvelle variante avec le générateur de sources, les méthodes doivent continuer static être, à la place de extern mais donne des coups de pied partial. Les paramètres à [LibraryImport] sont différents de [DllImport].

/// 
/// Neu ab .NET 7.0
/// [LibraryImport] erfordert static und partial!
/// 
public static partial class Win32APIMmitSG
{
 [LibraryImport("User32.dll")]
 [return: MarshalAs(UnmanagedType.Bool)]
 public static partial bool MessageBeep(UInt32 beepType);
 
 [LibraryImport("user32.dll", StringMarshalling = StringMarshalling.Utf16)]
 public static partial IntPtr MessageBoxW(int hWnd, string text, string caption, uint type);
 
 // ohne Zusatz "W": System.EntryPointNotFoundException: 'Unable to find an entry point named 'MessageBox' in DLL 'user32.dll'.', weil im generierten Code: ExactSpelling = true
 [LibraryImport("shell32.dll", StringMarshalling = StringMarshalling.Utf16)]
 public static partial int ShellAboutW(IntPtr hWnd, string szApp, string szOtherStuff, IntPtr hIcon);
}

Le générateur de source génère ensuite le code du programme lors de la compilation. Le code généré peut être vu dans le projet sous Dependencies/Analyzers/Microsoft.Interop.LibraryImportGenerator (voir Figure 1) :

Publicité



Extraits du code généré, ici pour MessageBeep() et MessageBoxW() (Fig. 1).

L’appel est identique dans chaque cas :

Console.WriteLine("Beep..."); 
Win32APIohneSG.MessageBeep(0x00000010);
Win32APIMmitSG.MessageBeep(0x00000010); 
 
Console.WriteLine("MessageBox...");
Win32APIohneSG.MessageBoxW(0, "Hallo von " + System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription, "Platform Invoke Sample", 0);
Win32APIMmitSG.MessageBoxW(0, "Hallo von " + System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription, "Platform Invoke Sample", 0);
 
Console.WriteLine("ShellAbout...");
Win32APIohneSG.ShellAbout(Process.GetCurrentProcess().MainWindowHandle, "AppName " + Assembly.GetExecutingAssembly()!.GetName()!.Version!.ToString(), "", IntPtr.Zero);
Win32APIMmitSG.ShellAboutW(Process.GetCurrentProcess().MainWindowHandle, "AppName " + Assembly.GetExecutingAssembly()!.GetName()!.Version!.ToString(), "", IntPtr.Zero);

Détails sur ce générateur de sources, notamment comment convertir ceux existants [DllImport]-des annotations, peut être trouvé dans la documentation.


(carte)

Vers la page d’accueil



#Nouveau #dans #.NET #28Générateur #source #pour #lappel #plateforme
1693007805

Facebook
Twitter
LinkedIn
Pinterest

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

ADVERTISEMENT