.NET 7.0’daki yenilikler [28]: Platform geri çağırma için kaynak oluşturucu

Womanne

Member
Bu serinin önceki iki bölümünde ele alınan düzenli ifade kaynak oluşturucuya ek olarak, .NET 7.0’da yerel işletim sistemi işlevlerine erişim için yeni bir kaynak oluşturucu da bulunmaktadır (.NET teknik terimi: Platform Invoke, kısaltılmış P/ invoke).

Duyuru








Dr. Holger Schwichtenberg, güvenlikle ilgili son derece kritik alanlarda bile yenilik ve deneyime dayalı yazılım geliştirme sunan MAXIMAGO’da Baş Teknoloji Uzmanıdır. Ayrıca, çok sayıda orta ve büyük ölçekli şirkete, yazılım geliştirme ve kullanımı konusunda tavsiye ve eğitim vererek 38 tanınmış uzmanla destek veren www.IT-Visions.de uzman ağının da başkanıdır.







Yeni kaynak oluşturucuya Microsoft.Interop.LibraryImportGenerator adı verilir. Ek açıklama yoluyla kullanılır [LibraryImport] önceki açıklamaya alternatif [DllImport]çalışma zamanında bir ara dil saplaması (IL saplaması) kodunun oluşturulmasını tetikledi. Ancak çalışma zamanı kodunun oluşturulması, bu serinin 17. bölümünde tartışılan ilk derleyici (AOT) ile birlikte mümkün değildir.

Aşağıdaki listede öncekiyle birlikte yapılan üç Windows API çağrısı örneği gösterilmektedir [DllImport]:


/// <summary>
/// <summary>
/// Altes Verfahren
/// [DllImport] erfordert static und extern!
/// </summary>
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);
}


Kaynak oluşturuculu yeni versiyonda yöntemler devam etmelidir static olmak yerine extern ama tekmeler partial. Parametreler bir [LibraryImport] onlar farklı [DllImport].


/// <summary>
/// Neu ab .NET 7.0
/// [LibraryImport] erfordert static und partial!
/// </summary>
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);
}


Kaynak oluşturucu daha sonra derleme sırasında program kodunu üretir. Oluşturulan kod, Dependeency/Analyzers/Microsoft.Interop.LibraryImportGenerator adresindeki projede görüntülenebilir (bkz. Şekil 1):

Duyuru







Oluşturulan koddan alıntılar, burada,MessageBeep() veMessageBoxW() için (Şekil 1).



Çağrı her durumda aynıdır:


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);


Bu kaynak oluşturucuyla ilgili ayrıntılar, özellikle mevcut olanların nasıl dönüştürüleceği [DllImport]-Ek açıklamalar belgelerde bulunabilir.


(harita)



Haberin Sonu
 
Üst