Condividi tramite


Chiamare API di interoperabilità da un'app .NET

In qualità di sviluppatore di applicazioni desktop C#, in .NET è possibile usare classi di interoperabilità C# che rappresentano diverse funzioni di interoperabilità e interfacce di interoperabilità COM (WinRT) 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 project desktop .NET per l'uso delle classi di interoperabilità C#

Le classi di interoperabilità C# elencate nella sezione successiva (Disponibili classi di interoperabilità C#) sono disponibili in .NET come parte del Windows App SDK oppure usando un particolare moniker Target Framework Moniker, come si vedrà.

In un progetto desktop C# di WinUI 3

Quando crei un nuovo project WinUI in Visual Studio (vedi Creare il tuo primo project WinUI), il tuo project è già configurato e puoi iniziare subito a usare tutte le classi di interoperabilità C#.

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

Per altri tipi di project desktop .NET, ad esempio Windows Presentation Foundation (WPF) o Windows Forms (WinForms), è necessario configurare il project prima di poter access le classi di interoperabilità C#. Per il primo set di classi elencate di seguito, è necessario fare riferimento al Windows App SDK. Per il secondo set, è necessario configurare un moniker Target Framework Moniker destinato a Windows 10, versione 1809 o successiva, come illustrato di seguito:

  1. Apri il file del progetto per il progetto desktop C# .NET.

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

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

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

Classi di interoperabilità C# disponibili

Note

Le classi seguenti richiedono l'SDK .NET 6 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/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 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 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 del 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

(WinRT.Interop) WindowNative

Per le alternative per WPF e WinForms, vedere Retrieve a window handle (HWND).

Esempio di codice

Questo esempio di codice illustra come usare due delle classi di interoperabilità C# in un'applicazione WinUI (vedere Crea il tuo primo progetto WinUI). Lo scenario di esempio consiste nel visualizzare un Windows. Storage. Pickers.FolderPicker. Ma prima di visualizzare il selettore in un'app desktop, è necessario inizializzarlo 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) l'interfaccia è rappresentata dalla classe di interoperabilità WinRT.Interop.WindowNative in 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 proprietaria, usare l'interfaccia di interoperabilità COM IInitializeWithWindow di WinRT. E 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 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 Recupera un handle di finestra (HWND) e Visualizzare 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 di .NET ed è stato spostato nel C#/WinRT toolkit (vedere il toolkit Built-in per WinRT viene rimosso da .NET).

Anche se la tecnica ComImport funziona 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, 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 inviare commenti e suggerimenti o per segnalare altri problemi, aggiungere commenti e suggerimenti a un problema esistente o segnalare un nuovo problema nel repository WindowsAppSDK GitHub.