Appeler des API d’interopérabilité à partir d’une application .NET

En tant que développeur d’applications de bureau C#, dans .NET vous pouvez utiliser des classes d’interopérabilité C# qui représentent plusieurs fonctions d’interopérabilité et interfaces d’interopérabilité com Windows Runtime (WinRT). Il s’agit notamment de classes C# représentant IWindowNative, IInitializeWithWindow, la fonction GetWindowIdFromWindow , et bien d’autres.

Cette rubrique répertorie les classes d’interopérabilité C# disponibles et montre comment les utiliser. La section Background à la fin de la rubrique décrit comment les interfaces d’interopérabilité ont été utilisées dans les versions précédentes de .NET et pourquoi la modification a été apportée.

Configurer un project de bureau .NET pour utiliser les classes d’interopérabilité C#

Les classes d'interopérabilité C# répertoriées dans la section suivante ( Classes d'interopérabilité C#availables) sont disponibles dans .NET dans le cadre de la Windows App SDK ou à l'aide d'un Target Framework Moniker comme nous le verrons.

Dans un projet de bureau WinUI 3 en C#

Lorsque vous créez un projet WinUI dans Visual Studio (voir Créez votre premier projet WinUI), votre projet est déjà configuré et vous pouvez commencer à utiliser toutes les classes d’interopérabilité C# immédiatement.

Dans d’autres types de project de bureau C# (WPF ou WinForms)

Pour d'autres types de project de bureau .NET, tels que Windows Presentation Foundation (WPF) ou Windows Forms (WinForms), vous devez configurer votre project avant de pouvoir access les classes d'interopérabilité C#. Pour le premier ensemble de classes répertorié ci-dessous, vous devez référencer la Windows App SDK. Pour le deuxième ensemble, vous devez configurer un moniker Target Framework qui cible Windows 10, version 1809 ou ultérieure, comme suit :

  1. Ouvrez le fichier project de votre project de bureau C# .NET.

  2. Dans le fichier .csproj, modifiez l’élément TargetFramework pour cibler une version spécifique du KIT de développement logiciel (SDK) .NET et Windows. Par exemple, l’élément suivant est approprié pour un project .NET 6 qui cible Windows 10, version 2004.

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

Pour plus d’informations, notamment pour obtenir la liste des autres valeurs prises en charge, consultez Utiliser l’option Moniker de framework cible.

Classes d’interopérabilité C# disponibles

Note

Les classes ci-dessous nécessitent le SDK .NET 6 ou version ultérieure.

Voici les classes d’interopérabilité C# disponibles, mappées à partir de leur fonction d’interopérabilité sous-jacente ou de l’interface com interop WinRT. Chaque classe répertoriée implémente la fonction/méthodes de son API d’interopérabilité sous-jacente et fournit des wrappers de type sécurisé pour les paramètres et les valeurs de retour. Par exemple, Windows.ApplicationModel.DataTransfer.DragDrop.Core.DragDropManagerInterop.GetForWindow nécessite un paramètre de handle de fenêtre IntPtr (HWND) et retourne un objet CoreDragDropManager . Toutes les classes d’interopérabilité C# ci-dessous et les méthodes associées sont statiques.

Disponible dans le cadre de la Windows App SDK

La classe Microsoft.UI.Win32Interop implémente les méthodes d’interopérabilité C# dans le tableau ci-dessous. Pour obtenir un exemple de code, consultez Gérer les fenêtres d’application.

Fonction d’interopérabilité Méthode d’interopérabilité 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)

Disponibles par le biais d’un moniker de framework cible

Interface d’interopérabilité COM WinRT Classe d’interopérabilité C#
IAccountsSettingsPaneInterop (Windows.UI.ApplicationSettings) AccountsSettingsPaneInterop
IDisplayInformationStaticsInterop Introduit avec TFM net6.0-windows10.0.22621.0 et .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 WinUI uniquement

(WinRT.Interop) WindowNative

Pour obtenir des alternatives à WPF et WinForms, consultez Récupérer un handle de fenêtre (HWND).

Exemple de code

Cet exemple de code montre comment utiliser deux classes d’interopérabilité C# dans une application WinUI (voir Créer votre première project). L’exemple de scénario consiste à afficher un Windows. Storage. Pickers.FolderPicker. Mais avant d’afficher le sélecteur dans une appareil de bureau, vous devez l’initialiser avec le handle (HWND) de la fenêtre propriétaire.

  1. Vous pouvez obtenir un handle de fenêtre (HWND) à l’aide de l’interface WinRT COM d’interopérabilité IWindowNative. Et (à la recherche dans la table de la section précédente) cette interface est représentée par la classe d’interopérabilité C# WinRT.Interop.WindowNative . Ici, l’objet this est une référence à un objet Microsoft.UI.Xaml.Window à partir du fichier code-behind de la fenêtre principale.
  2. Pour initialiser un élément d’interface utilisateur avec une fenêtre propriétaire, vous utilisez l’interface WinRT d’interopérabilité COM IInitializeWithWindow. Et cette interface est représentée par la classe d’interopérabilité 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();
}

Consultez également Récupérer un handle de fenêtre (HWND) et Afficher des objets d’interface utilisateur WinRT qui dépendent de CoreWindow.

Background

Les versions précédentes du framework .NET et .NET Core avaient une connaissance intégrée de WinRT. Avec ces versions précédentes, vous pouvez définir une interface d’interopérabilité directement en C# avec l’attribut ComImport , puis convertir directement une classe projetée vers cette interface d’interopérabilité.

Étant donné que WinRT est une technologie spécifique à Windows, pour prendre en charge les objectifs de portabilité et d’efficacité de .NET, nous avons levé la prise en charge de la projection WinRT hors du compilateur C# et .NET runtime, et l’avons déplacée dans le C#/WinRT toolkit (voir Prise en charge de WinRT est supprimée de .NET).

Bien que la technique ComImport fonctionne toujours pour les interfaces d’interopérabilité basées sur IUnknown, elle ne fonctionne plus pour les interfaces basées sur IInspectable utilisées pour l’interopérabilité avec WinRT.

Ainsi, en tant que remplacement, dans .NET, vous pouvez utiliser les classes d’interopérabilité C# décrites dans cette rubrique.

Dépannage et problèmes connus

Il n’existe actuellement aucun problème connu pour les classes d’interopérabilité C#. Pour fournir des commentaires ou signaler d’autres problèmes, ajoutez vos commentaires à un problème existant ou déposez un nouveau problème sur le WindowsAppSDK GitHub référentiel.