Partager via


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 Arrière-plan à 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 projet 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# disponibles) sont disponibles dans .NET dans le cadre du KIT de développement logiciel (SDK) de l’application Windows , ou bien à l’aide d’un moniker Target Framework particulier, comme nous le verrons.

Dans un projet de bureau WinUI 3 C#

Lorsque vous créez un projet WinUI 3 dans Visual Studio (voir Créer votre premier projet WinUI 3), 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 projets de bureau C# (WPF ou WinForms)

Pour d’autres types de projets de bureau .NET, tels que 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 répertorié ci-dessous, vous devez référencer le kit sdk d’application Windows . 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 projet pour votre projet de bureau C# .NET.

  2. Dans le .csproj fichier, 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 projet .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 Kit de développement logiciel (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 du Kit de développement logiciel (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 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) à 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 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 des objets d’interface utilisateur WinRT qui dépendent de CoreWindow.

Background

Les versions précédentes du .NET Framework et de .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 du runtime .NET, et l’avons déplacée dans le kit de ressources C#/WinRT (voir la prise en charge intégrée 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 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 dépôt GitHub WindowsAppSDK.