Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Windows desktop-apps (WinUI 3, WPF, WinForms, console) moeten soms API's buiten hun beheerde framework aanroepen. Deze pagina helpt u te begrijpen wanneer dat gebeurt en de juiste techniek te kiezen.
Twee API-interfaces, twee interoperabiliteitspatronen
Windows functionaliteit beschikbaar maakt via twee hoofd-API-oppervlakken:
Win32-API's: de klassieke C-stijlfuncties die zijn geëxporteerd uit systeem-DLL's (
user32.dll,kernel32.dllshell32.dll, enzovoort). Deze omvatten bewerkingen op laag niveau, zoals vensterbeheer, bestands-I/O, procesbeheer en hardwaretoegang. Ze bestaan sinds de vroegste versies van Windows en blijven de manier om toegang te krijgen tot veel functies van het besturingssysteem die geen beheerd equivalent hebben.Windows Runtime API's (WinRT): een modern objectgeoriënteerd API-oppervlak (naamruimten beginnend met
Windows.*) dat is geïntroduceerd met Windows 8. WinRT-API's hebben betrekking op gebieden zoals meldingen, mediaopname, Bluetooth, geolocatie en meer. De meeste WinRT-API's zijn rechtstreeks toegankelijk vanuit .NET zonder speciale inspanning, maar sommige hebben beperkingen in desktop-apps of vereisen een venstergreep (HWND) om te functioneren.
Wanneer u interop tegenkomt
Doorgaans hebt u interop nodig wanneer uw app-framework een bepaalde besturingssysteemmogelijkheid niet rechtstreeks beschikbaar maakt. Veelvoorkomende scenario's zijn onder andere:
| Scenario | Welk API-oppervlak | Example |
|---|---|---|
| Titelbalk of vensterplaatsing aanpassen | Win32 |
SetWindowPos, DwmExtendFrameIntoClientArea |
| Een venster instellen als 'altijd op voorgrond' of de Z-volgorde bepalen | Win32 |
SetWindowPos met HWND_TOPMOST |
| Een bestandskiezer of deelvenster weergeven in WinUI 3 | WinRT (heeft HWND nodig) |
FileOpenPicker met InitializeWithWindow |
| Systeemgeheugen of prestatiemetergegevens lezen | Win32 |
GlobalMemoryStatusEx, QueryPerformanceCounter |
| Een globale sneltoets registreren | Win32 | RegisterHotKey |
| Een toastmelding verzenden (niet-verpakte app) | WinRT (met App SDK) | AppNotificationManager |
In al deze gevallen schrijft u normale C#-code, maar roept u Windows aan via een interoperabiliteitslaag. In de onderstaande onderwerpen wordt u begeleid bij elke benadering.
Beslissingshandleiding
| Ik moet... | Aanbevolen aanpak | Onderwerp |
|---|---|---|
| Een Win32-API aanroepen (gebruiker32, kernel32, shell32, enzovoort) vanuit C# | Gebruik de CsWin32-brongenerator : type-veilig, geen handgeschreven handtekeningen | Win32-API's aanroepen vanuit C# (CsWin32) |
| Een WinRT-object initialiseren met een venstergreep (kiezers , dialoogvensters, gebruikersinterface delen) | Gebruik de .NET WinRT COM-interoperabiliteitsklassen (InitializeWithWindow, WindowNativeenzovoort) |
Interop-API's aanroepen vanuit een .NET-app |
| Controleren of een WinRT-API werkt in een desktop-app (niet-UWP)-app | Raadpleeg de lijst met beperkingen en alternatieven | WinRT-API's worden niet ondersteund in bureaublad-apps |
| Bekijk een volledig WinUI 3-voorbeeld waarmee een venster wordt aangepast met behulp van Win32-aanroepen | Volg de volledige stapsgewijze uitleg | Overzicht: WinUI 3-app met Win32-interop |
Snel stroomdiagram
Bevindt de API zich in een
Windows.*WinRT-naamruimte?- Ja → WinRT-API's controleren die niet worden ondersteund in desktop-apps voor beperkingen. Als voor de API een venstergreep is vereist, raadpleegt u Interop-API's aanroepen vanuit een .NET-app.
- Geen → Ga verder met stap 2.
Is het een Win32/native API (gedefinieerd in een Windows SDK-header)?
- Ja → CsWin32 gebruiken om typeveilige P/Invoke-bindingen te genereren.
- Geen → Het kan een COM-interface of systeemeigen bibliotheek van derden zijn. Zie .NET interoperabiliteit met systeemeigen code voor algemene P/Invoke-richtlijnen.
Verwante onderwerpen
Windows developer