.NET 7.0'da yeni [28]: Platform için Origin Jeneratörü

Womanne

Member
Bu serinin önceki iki bölümünde tedavi edilen normal ifadeler için menşe jeneratörüne ek olarak, yerel işletim sisteminin işlevlerine erişim için yeni bir menşe jeneratörü de vardır (.NET: Platform Makyonları, Kısaltılmış P/Invoke).










Holger Schwichtenberg, 53 ünlü uzmanla tavsiye ve eğitim yoluyla ve yazılımın geliştirilmesinde çok sayıda orta ve büyük şirketi destekleyen uzmanlar ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası uzman konferansındaki görünümleri, 90'dan fazla uzman kitabı ve 1.500'den fazla uzman makalesi sayesinde Holger Schwichtenberg, Almanya'daki .NET ve Web teknikleri için en iyi uzmanlardan biridir.







Yeni Origin jeneratörüne microsoft.interop.libraryImport denir. Ek açıklama yoluyla kullanılır [LibraryImport] Önceki ek açıklamaya alternatif olarak [DllImport]Bu, sonunda ara dil (saplama) için bir saplama tetikledi. Bununla birlikte, bu serinin 17. Bölümünde tedavi edilen derleyici önceden (AOT) ile kombinasyon halinde kodu kodu terimi mümkün değildir.



Aşağıdaki listede bir öncekiyle birlikte Windows API çağrılarının üç örneği [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);
}


Origin jeneratörü ile yeni varyantta, yöntemler static yerinde olmak extern Ama tekme partial. Parametreler a [LibraryImport] Bunlardan farklıdırlar [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);
}


Bu nedenle orijinal jeneratör derleme sırasında program kodunu oluşturur. Oluşturulan kod, Bağımlılık/Analizörler Projesi/Microsoft.Interop.LibraryImport Jeneratöründe görüntülenebilir (bkz. Şekil 1):










MessageBeep () ve MessageBoxW () için oluşturulan koddan alıntılar (Şekil 1).



Çağrı 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 jeneratörü, özellikle de mevcut olanların dönüştürülmesi için detaylar [DllImport]-Notasyonlar belgelerde bulunabilir.


(harita)
 
Üst