Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
L'API si trova in uno
Windows.*spazio dei nomi WinRT?- Sì → Controllare le API WinRT non supportate nelle app desktop per le restrizioni. Se l'API richiede un handle di finestra, vedere Chiamare API di interoperabilità da un'app .NET.
- No → Continuare al passaggio 2.
È un'API Win32/nativa (definita in un'intestazione Windows SDK)?
- Sì → Usare CsWin32 per generare associazioni P/Invoke indipendenti dai tipi.
- Nessuna → Potrebbe trattarsi di un'interfaccia COM o di una libreria nativa di terze parti. Per indicazioni generali su P/Invoke, vedere l'interoperabilità di .NET con il codice nativo.