Chiamare le API di interoperabilità da un'app .NET

Gli sviluppatori di applicazioni desktop C# in .NET possono usare classi di interoperabilità C# che rappresentano diverse funzioni di interoperabilità e interfacce di interoperabilità COM Windows Runtime (WinRT). Queste includono classi C# che rappresentano IWindowNative, IInitializeWithWindow, la funzione GetWindowIdFromWindow 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 del SDK per app di Windows oppure usando un particolare moniker del 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 Forms (WinForms), è 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 alla SDK per app di Windows. Per il secondo set, è necessario configurare un moniker framework di destinazione destinato Windows 10, versione 1809 o versione successiva, come illustrato di seguito:

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

  2. .csproj Nel file 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 relativa funzione di interoperabilità sottostante o dall'interfaccia di interoperabilità COM WinRT. Ogni classe elencata implementa la funzione/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 IntPtr (HWND) e restituisce un oggetto CoreDragDropManager . Tutte le classi di interoperabilità C# seguenti e i metodi associati sono statici.

Disponibile come parte del SDK per app di Windows

La classe Microsoft.UI.Win32Interop implementa i metodi di interoperabilità C# nella tabella seguente. Per un esempio di codice, vedere Gestire le finestre delle 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 Introdotto 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 per WPF e WinForms, vedere Recuperare un handle di finestra (HWND).For alternatives for WPF and WinForms, see Retrieve a window handle (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 windows.Storage.Pickers.FolderPicker. Ma 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. E (esaminando la tabella nella sezione precedente) che l'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 IInitializeWithWindow WinRT COM. 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();
}

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

Background

Le versioni precedenti di .NET Framework e .NET Core avevano una conoscenza predefinita 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, è stato rimosso il supporto della proiezione WinRT dal compilatore C# e dal runtime .NET e spostato nel toolkit C#/WinRT (vedere Supporto predefinito per WinRT viene rimosso da .NET).

Sebbene la tecnica 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.

In .NET è quindi 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.