Scegliere l'approccio di interoperabilità per le app di Windows

Windows app desktop (WinUI 3, macchine virtuali Windows, WinForms, console) a volte devono chiamare API al di fuori del framework gestito. Questa pagina consente di comprendere quando accade e di scegliere la tecnica corretta.

Due superfici API, due modelli di interoperabilità

Windows espone la funzionalità tramite due superfici API principali:

  • API Win32 : le funzioni classiche in stile C esportate dalle DLL di sistema (user32.dll, kernel32.dll, shell32.dlle così via). Queste operazioni coprono operazioni di basso livello, ad esempio la gestione delle finestre, l'I/O dei file, il controllo dei processi e l'accesso hardware. Esistono sin dalle prime versioni di Windows e rimangono il modo per accedere a molte funzionalità del sistema operativo che non hanno un equivalente gestito.

  • API Windows Runtime (WinRT): una superficie API moderna orientata agli oggetti (spazi dei nomi che iniziano con Windows.*) introdotta con Windows 8. Le API WinRT coprono aree come notifiche, acquisizione multimediale, Bluetooth, georilevazione e altro ancora. La maggior parte delle API WinRT è direttamente accessibile da .NET senza sforzo speciale, ma alcune hanno restrizioni nelle app desktop o richiedono un handle di finestra (HWND) per funzionare.

Quando avrai a che fare con l'interoperabilità

In genere è necessaria l'interoperabilità quando il framework dell'app non espone direttamente una particolare funzionalità del sistema operativo. Gli scenari comuni includono:

Scenario Quale interfaccia API Example
Personalizzare il posizionamento della barra del titolo o della finestra Win32 SetWindowPos, DwmExtendFrameIntoClientArea
Impostare una finestra come "sempre in alto" o controllare l'ordine Z Win32 SetWindowPos con HWND_TOPMOST
Visualizzare una finestra di dialogo di selezione file o condivisione da WinUI 3 WinRT (richiede HWND) FileOpenPicker con InitializeWithWindow
Leggere i contatori delle prestazioni o della memoria di sistema Win32 GlobalMemoryStatusEx, QueryPerformanceCounter
Registrare un tasto di scelta rapida globale Win32 RegisterHotKey
Inviare una notifica di tipo avviso popup (app non in pacchetto) WinRT (con App SDK) AppNotificationManager

In tutti questi casi, si scrive normale codice C#, ma si interagisce con Windows attraverso un livello di interoperabilità. Gli argomenti seguenti illustrano ogni approccio.

Guida alle decisioni

Devo … Approccio consigliato Topic
Chiamare un'API Win32 (user32, kernel32, shell32 e così via) da C# Usa il generatore di codice sorgente CsWin32, con controllo dei tipi, senza firme scritte a mano Chiamare le API Win32 da C# (CsWin32)
Inizializzare un oggetto WinRT con un handle di una finestra (selettori, finestre di dialogo, interfaccia di condivisione) Usare le classi di interoperabilità COM WinRT .NET (InitializeWithWindow, WindowNativee così via) Chiama le API di interoperabilità da un'app .NET
Controllare se un'API WinRT funziona in un'app desktop (non UWP) Consultare l'elenco delle restrizioni e delle alternative API WinRT non supportate nelle app desktop
Vedi un esempio di WinUI 3 completo che personalizza una finestra usando le chiamate Win32 Segui la guida dettagliata completa Procedura dettagliata: App WinUI 3 con interoperabilità Win32

Diagramma di flusso rapido

  1. L'API si trova in uno Windows.* spazio dei nomi WinRT?

  2. È un'API Win32/nativa (definita in un'intestazione Windows SDK)?