Wählen Sie Ihren Interoperabilitätsansatz für Windows-Apps

Windows Desktop-Apps (WinUI 3, WPF, WinForms, Konsole) müssen manchmal APIs außerhalb ihres verwalteten Frameworks aufrufen. Diese Seite hilft Ihnen zu verstehen, wann dies geschieht, und wählen Sie die richtige Technik aus.

Zwei API-Oberflächen, zwei Interopmuster

Windows macht Funktionen über zwei Haupt-API-Oberflächen verfügbar:

  • Win32-APIs – Die klassischen C-Stil-Funktionen, die aus System-DLLs (user32.dll, kernel32.dll, , shell32.dllusw.) exportiert wurden. Diese umfassen Vorgänge auf niedriger Ebene wie Fensterverwaltung, Datei-E/A, Prozesssteuerung und Hardwarezugriff. Sie sind seit den frühesten Versionen von Windows vorhanden und können weiterhin auf viele Betriebssystemfeatures zugreifen, die keine verwaltete Entsprechung haben.

  • Windows-Runtime -APIs (WinRT) – Eine moderne objektorientierte API-Oberfläche (beginnend mit Windows.*) eingeführt mit Windows 8. WinRT-APIs decken Bereiche wie Benachrichtigungen, Medienaufnahme, Bluetooth, Geolocation und vieles mehr ab. Auf die meisten WinRT-APIs kann direkt über .NET ohne besonderen Aufwand zugegriffen werden, aber einige haben Einschränkungen in Desktop-Apps oder erfordern ein Fensterhandle (HWND), um zu funktionieren.

Wenn Sie auf Interop stoßen

In der Regel benötigen Sie Interop, wenn Ihr App-Framework keine bestimmte Betriebssystemfunktion direkt verfügbar macht. Zu den gängigen Szenarien gehören:

Szenario Welche API-Oberfläche Example
Anpassen der Titelleiste oder Fensterplatzierung Win32 SetWindowPos, DwmExtendFrameIntoClientArea
Ein Fenster als "immer im Vordergrund" festlegen oder die Z-Reihenfolge steuern Win32 SetWindowPos mit HWND_TOPMOST
Ein Dateiauswahlfenster oder einen Freigabedialog in WinUI 3 anzeigen WinRT (benötigt HWND) FileOpenPicker mit InitializeWithWindow
Lesen von Systemspeicher oder Leistungsindikatoren Win32 GlobalMemoryStatusEx, QueryPerformanceCounter
Registrieren eines globalen Hotkeys Win32 RegisterHotKey
Senden einer Toastbenachrichtigung (nicht paketierte App) WinRT (mit App SDK) AppNotificationManager

In all diesen Fällen schreiben Sie normalen C#-Code, rufen jedoch Windows über eine Interoperabilitätsebene auf. Die folgenden Themen führen Sie durch jeden Ansatz.

Leitfaden zur Entscheidungsfindung

Ich muss... Empfohlener Ansatz Thema
Aufrufen einer Win32-API (User32, kernel32, shell32 usw.) von C# Verwenden des CsWin32-Quellgenerators – typsicher, ohne handschriftlichen Signaturen Aufrufen von Win32-APIs aus C# (CsWin32)
Initialisieren eines WinRT-Objekts mit einem Fensterziehpunkt (Auswahl, Dialogfelder, Freigeben der Benutzeroberfläche) Verwenden der .NET WinRT COM-Interoperabilitätsklassen (InitializeWithWindow, WindowNativeusw.) Interop-APIs aus einer .NET-Anwendung aufrufen
Überprüfen, ob eine WinRT-API in einer Desktop-App (nicht UWP) funktioniert Weitere Informationen finden Sie in der Liste "Einschränkungen und Alternativen" WinRT-APIs werden in Desktop-Apps nicht unterstützt
Ein vollständiges WinUI 3-Beispiel zum Anpassen eines Fensters mithilfe von Win32-Aufrufen Durchlaufen Sie die End-to-End-Schritt-für-Schritt-Anleitung Exemplarische Vorgehensweise: WinUI 3-App mit Win32-Interoperabilität

Schnellflussdiagramm

  1. Befindet sich die API in einem Windows.* WinRT-Namespace?

  2. Ist es eine Win32/native API (definiert in einem Windows SDK-Header)?