Chiamare le API interop da un'app .NET

In quanto sviluppatore di applicazioni desktop C#, in .NET è possibile usare le classi di interoperabilità C#, che rappresentano varie funzioni di interoperabilità, e le interfacce di interoperabilità COM di Windows Runtime (WinRT). Sono incluse classi C# che rappresentano IWindowNative, IInitializeWithWindow, la funzione GetWindowIdFromWindowIdFromWindow e molte altre.

Questo argomento elenca le classi di interoperabilità C# disponibili e illustra come usarle. La sezione Background alla fine dell'argomento descrive come sono state usate le interfacce di interoperabilità nelle versioni precedenti di .NET e il motivo per cui è stata apportata la modifica.

Configurare un progetto desktop .NET per l'uso delle classi di interoperabilità C#

Le classi di interoperabilità C# elencate nella sezione successiva (Classi di interoperabilità C# disponibili) sono disponibili in .NET come parte di Windows App SDK oppure usando un particolare Moniker framework di destinazione, come si vedrà.

In un progetto desktop C# WinUI 3

Quando si crea un nuovo progetto WinUI 3 in Visual Studio (vedere Creare il primo progetto WinUI 3), il progetto è già configurato ed è possibile iniziare subito a usare tutte le classi di interoperabilità C#.

In altri tipi di progetto desktop C# (WPF o WinForms)

Per altri tipi di progetto desktop .NET, ad esempio Windows Presentation Foundation (WPF) o Windows Form (WinForms), sarà necessario configurare il progetto prima di poter accedere alle classi di interoperabilità C#. Per il primo set di classi elencate di seguito, è necessario fare riferimento a Windows App SDK. Per il secondo set, sarà necessario configurare un Moniker framework di destinazione che punti a Windows 10, versione 1809 o successiva, come indicato di seguito:

  1. Aprire il file di progetto per il progetto desktop .NET C#.

  2. Nel file .csproj modificare l'elemento TargetFramework per specificare come destinazione una versione specifica di .NET e Windows SDK. Ad esempio, l'elemento seguente è appropriato per un progetto .NET 6 destinato a Windows 10, versione 2004.

    <PropertyGroup>
      <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
    </PropertyGroup>
    

Per altre informazioni, incluso un elenco di altri valori supportati, vedere Usare l'opzione Moniker framework di destinazione.

Classi di interoperabilità C# disponibili

Nota

Le classi seguenti richiedono .NET 6 SDK o versione successiva.

Ecco le classi di interoperabilità C# disponibili, mappate dalla funzione di interoperabilità sottostante o dall'interfaccia di interoperabilità COM WinRT. Ogni classe elencata implementa la funzione o i metodi dell'API di interoperabilità sottostante e fornisce wrapper indipendenti dai tipi per i parametri e i valori restituiti. Ad esempio, Windows.ApplicationModel.DataTransfer.DragDrop.Core.DragDropManagerInterop.GetForWindow richiede un parametro handle di finestra (HWND) IntPtr e restituisce un oggetto CoreDragDropManager. Tutte le classi di interoperabilità C# seguenti e i metodi associati sono statici.

Disponibile come parte di Windows App SDK

La classe Microsoft.UI.Win32Interop implementa i metodi di interoperabilità C# nella tabella seguente. Per un esempio di codice, vedere Gestire le finestre dell'app.

Funzione di interoperabilità Metodo di interoperabilità C#
GetDisplayIdFromMonitor (Microsoft.UI) DisplayId Win32Interop.GetDisplayIdFromMonitor(IntPtr hmonitor)
GetIconFromIconId (Microsoft.UI) IntPtr Win32Interop.GetIconFromIconId(IconId iconId)
GetIconIdFromIcon (Microsoft.UI) IconId Win32Interop.GetIconIdFromIcon(IntPtr hicon)
GetMonitorFromDisplayId (Microsoft.UI) IntPtr Win32Interop.GetMonitorFromDisplayId(DisplayId displayId)
GetWindowFromWindowId (Microsoft.UI) IntPtr Win32Interop.GetWindowFromWindowId(WindowId windowId)
GetWindowIdFromWindow (Microsoft.UI) WindowId Win32Interop.GetWindowIdFromWindow(IntPtr hwnd)

Disponibile tramite Moniker framework di destinazione

Interfaccia di interoperabilità COM WinRT Classe di interoperabilità C#
IAccountsSettingsPaneInterop (Windows.UI.ApplicationSettings) AccountsSettingsPaneInterop
IDisplayInformationStaticsInterop Modifiche introdotte con TFM net6.0-windows10.0.22621.0 e .NET 6.0.7.

(Windows.Graphics.Display) DisplayInformationInterop
IDragDropManagerInterop (Windows.ApplicationModel.DataTransfer.DragDrop.Core) DragDropManagerInterop
IInitializeWithWindow (WinRT.Interop) InitializeWithWindow
IInputPaneInterop (Windows.UI.ViewManagement) InputPaneInterop
IPlayToManagerInterop (Windows.Media.PlayTo) PlayToManagerInterop
IPrintManagerInterop (Windows.Graphics.Printing) PrintManagerInterop
IRadialControllerConfigurationInterop (Windows.UI.Input) RadialControllerConfigurationInterop
IRadialControllerIndependentInputSourceInterop (Windows.UI.Input.Core) RadialControllerIndependentInputSourceInterop
IRadialControllerInterop (Windows.UI.Input) RadialControllerInterop
ISpatialInteractionManagerInterop (Windows.UI.Input.Spatial) SpatialInteractionManagerInterop
ISystemMediaTransportControlsInterop (Windows.Media) SystemMediaTransportControlsInterop
IUIViewSettingsInterop (Windows.UI.ViewManagement) UIViewSettingsInterop
IUserConsentVerifierInterop (Windows.Security.Credentials.UI) UserConsentVerifierInterop
IWebAuthenticationCoreManagerInterop (Windows.Security.Authentication.Web.Core) WebAuthenticationCoreManagerInterop
IWindowNative Solo WinUI 3

(WinRT.Interop) WindowNative

Per le alternative a WPF e WinForms, vedere Recuperare un handle di finestra (HWND).

Esempio di codice

Questo esempio di codice illustra come usare due classi di interoperabilità C# in un'applicazione WinUI 3 (vedere Creare il primo progetto WinUI 3). Lo scenario di esempio consiste nel visualizzare un Windows.Storage.Pickers.FolderPicker. Tuttavia, prima di visualizzare la selezione in un'app desktop, è necessario inizializzarla con l'handle (HWND) della finestra del proprietario.

  1. È possibile ottenere un handle di finestra (HWND) usando l'interfaccia di interoperabilità COM IWindowNative WinRT COM. E (esaminando la tabella nella sezione precedente) tale interfaccia è rappresentata dalla classe di interoperabilità WinRT.Interop.WindowNative C#. In questo caso, l'oggetto this è un riferimento a un oggetto Microsoft.UI.Xaml.Window dal file code-behind della finestra principale.
  2. Per inizializzare una parte dell'interfaccia utente con una finestra di proprietario, usare l'interfaccia di interoperabilità COM WinRT IInitializeWithWindow. Questa interfaccia è rappresentata dalla classe di interoperabilità WinRT.Interop.InitializeWithWindow C#.
private async void myButton_Click(object sender, RoutedEventArgs e)
{
    // Create a folder picker.
    var folderPicker = new Windows.Storage.Pickers.FolderPicker();

    // 1. Retrieve the window handle (HWND) of the current WinUI 3 window.
    var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);

    // 2. Initialize the folder picker with the window handle (HWND).
    WinRT.Interop.InitializeWithWindow.Initialize(folderPicker, hWnd);

    // Use the folder picker as usual.
    folderPicker.FileTypeFilter.Add("*");
    var folder = await folderPicker.PickSingleFolderAsync();
}

Vedere anche Recuperare un handle di finestra (HWND) e Visualizzare oggetti interfaccia utente WinRT che dipendono da CoreWindow.

Background

Le versioni precedenti di .NET Framework e .NET Core includevano il supporto predefinito di WinRT. Con queste versioni precedenti, è possibile definire un'interfaccia di interoperabilità direttamente in C# con l'attributo ComImport e quindi eseguire direttamente il cast di una classe proiettata a tale interfaccia di interoperabilità.

Poiché WinRT è una tecnologia specifica di Windows, per supportare gli obiettivi di portabilità ed efficienza di .NET 6+, il supporto delle proiezioni WinRT è stato rimosso dal compilatore C# e dal runtime .NET ed è stato spostato nel toolkit di C#/WinRT. Vedere Supporto predefinito per WinRT rimosso da .NET.

Sebbene la tecnica di ComImport funzioni ancora per le interfacce di interoperabilità basate su IUnknown, non funziona più per le interfacce basate su IInspectable usate per l'interoperabilità con WinRT.

Pertanto, come sostituzione, in .NET è possibile usare le classi di interoperabilità C# descritte in questo argomento.

Risoluzione dei problemi e problemi noti

Attualmente non sono presenti problemi noti per le classi di interoperabilità C#. Per fornire commenti e suggerimenti o per segnalare altri problemi, aggiungere commenti e suggerimenti a un problema esistente oppure segnalare un nuovo problema nel repository GitHub di WindowsAppSDK.