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

En tant que développeur d’applications bureautiques en C#, vous pouvez, dans .NET, 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 de classes C# représentant IWindowNative, IInitializeWithWindow, la fonction GetWindowIdFromWindow et bien d’autres.

Cette rubrique liste les classes d’interopérabilité C# disponibles et vous montre comment les utiliser. La section Informations générales à la fin de la rubrique décrit comment les interfaces d’interopérabilité étaient utilisées dans les versions précédentes de .NET et pourquoi la modification a été apportée.

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

Les classes d’interopérabilité C# listées dans la section suivante (Classes d’interopérabilité C# disponibles) sont disponibles dans .NET dans le cadre du SDK d’application Windows. Vous pouvez également y accéder en utilisant un moniker de framework cible spécifique, comme nous le verrons un peu plus loin.

Dans un projet de bureau C# WinUI 3

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

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

Pour les autres types de projets de bureau .NET, comme Windows Presentation Foundation (WPF) ou Windows Forms (WinForms), vous devez configurer votre projet avant de pouvoir accéder aux classes d’interopérabilité C#. Pour le premier ensemble de classes listé ci-dessous, vous devez référencer le SDK d’application Windows. Pour le deuxième ensemble, vous devez configurer un moniker de framework cible qui cible Windows 10, version 1809 ou ultérieure, comme ceci :

  1. Ouvrez le fichier projet pour votre projet de bureau C# .NET.

  2. Dans le fichier .csproj, modifiez l’élément TargetFramework pour qu’il cible une version spécifique de .NET et du SDK Windows. Par exemple, l’élément suivant est approprié pour un projet .NET 6 qui cible Windows 10, version 2004.

    <PropertyGroup>
      <TargetFramework>net6.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 ultérieur.

Voici les classes d’interopérabilité C# disponibles, mappées à partir de la fonction d’interopérabilité sous-jacente ou de l’interface d’interopérabilité COM WinRT. Chaque classe listée implémente la fonction/les 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 (HWND) IntPtr et retourne un objet CoreDragDropManager. Toutes les classes d’interopérabilité C# ci-dessous et les méthodes associées sont statiques.

Disponibles dans le cadre du SDK d’application Windows

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 3 uniquement

(WinRT.Interop) WindowNative

Pour les solutions de remplacement pour WPF et WinForms, consultez Récupérer un handle de fenêtre (HWND).

Exemple de code

Cet exemple de code montre comment utiliser deux des classes d’interopérabilité C# dans une application WinUI 3 (voir Créer votre premier projet WinUI 3). 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) en utilisant l’interface d’interopérabilité COM WinRT IWindowNative. Si vous examinez le tableau 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 du fichier code-behind de la fenêtre principale.
  2. Pour initialiser une partie de l’interface utilisateur avec une fenêtre propriétaire, utilisez l’interface d’interopérabilité COM WinRT IInitializeWithWindow. Cette interface est représentée par la classe d’interopérabilité C# WinRT.Interop.InitializeWithWindow.
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();
}

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

Arrière-plan

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

WinRT est une technologie spécifique à Windows. Ainsi, pour prendre en charge les objectifs de portabilité et d’efficacité de .NET, nous avons retiré la prise en charge de la projection WinRT du compilateur C# et du runtime .NET, et nous l’avons déplacée dans le kit de ressources C#/WinRT (voirPrise en charge intégrée de WinRT 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 celles basées sur IInspectable qui sont utilisées pour l’interopérabilité avec WinRT.

Comme solution de remplacement dans .NET, vous pouvez donc utiliser les classes d’interopérabilité C# décrites dans cette rubrique.

Problèmes connus et dépannage

Il n’existe actuellement aucun problème connu pour les classes d’interopérabilité C#. Pour faire part de vos commentaires ou signaler d’autres problèmes, ajoutez votre commentaire à un problème existant ou créez un problème dans le dépôt GitHub WindowsAppSDK.