Llamada a las API de interoperabilidad desde una aplicación con .NET

Como desarrollador de aplicaciones de escritorio de C#, en .NET puede usar las clases de interoperabilidad de C# que representan varias funciones de interoperabilidad e interfaces de interoperabilidad COM de Windows Runtime (WinRT). Estas incluyen clases de C# que representan IWindowNative, IInitializeWithWindow, la función GetWindowIdFromWindow y muchas otras.

En este tema se enumeran las clases de interoperabilidad de C# disponibles y se muestra cómo usarlas. En la secciónFondo al final del tema se describe cómo se usaron las interfaces de interoperabilidad en versiones anteriores de .NET y por qué se realizó el cambio.

Configuración de un proyecto de escritorio de .NET para usar las clases de interoperabilidad de C#

Las clases de interoperabilidad de C# que se enumeran en la siguiente sección (Clases de interoperabilidad de C# disponibles) están disponibles en .NET, ya sea como parte del SDK de aplicaciones de Windows, o mediante el uso de un Moniker de la plataforma de destino determinado, como veremos más adelante.

En un proyecto de escritorio de WinUI 3 en C#

Cuando crea un nuevo proyecto de WinUI 3 en Visual Studio (consulte Creación del primer proyecto de WinUI 3), el proyecto ya estará configurado y puede comenzar a usar todas las clases de interoperabilidad de C# de inmediato.

En otros tipos de proyecto de escritorio de C# (WPF o WinForms)

Para otros tipos de proyectos de escritorio de .NET, como Windows Presentation Foundation (WPF) o Windows Forms (WinForms), tendrá que configurar el proyecto para poder acceder a las clases de interoperabilidad de C#. Para el primer conjunto de clases que se enumeran a continuación, deberá hacer referencia al SDK de aplicación de Windows. Para el segundo conjunto, deberá configurar un Moniker de la plataforma de destino que apunte a Windows 10 (versión 1809 o posterior), de esta manera:

  1. Abra el archivo de proyecto para el proyecto de escritorio de .NET de C#.

  2. En el archivo .csproj, modifique el elemento TargetFramework para dirigirlo a una versión específica de .NET y de Windows SDK. Por ejemplo, el siguiente elemento es adecuado para un proyecto de .NET 6 destinado a Windows 10 (versión 2004).

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

Para obtener más información, incluida una lista de otros valores admitidos, consulte Uso de la opción Moniker de la plataforma de destino.

Clases de interoperabilidad disponibles en C#

Nota

Las clases siguientes requieren el SDK de .NET 6 o versiones posteriores.

Estas son las clases de interoperabilidad de C# disponibles, que se asignaron desde la función de interoperabilidad subyacente o la interfaz de interoperabilidad COM de WinRT. Cada clase enumerada implementa la función o los métodos de la API de interoperabilidad subyacente y proporciona contenedores de tipo seguro para los parámetros y los valores devueltos. Por ejemplo, Windows.ApplicationModel.DataTransfer.DragDrop.Core.DragDropManagerInterop.GetForWindow requiere un parámetro de identificador de ventana (HWND) IntPtr, y devuelve un objeto CoreDragDropManager. Todas las clases de interoperabilidad de C# siguientes y los métodos asociados son estáticos.

Disponible como parte del SDK de aplicaciones de Windows

La clase Microsoft.UI.Win32Interop implementa los métodos de interoperabilidad de C# en la tabla siguiente. Para ver un ejemplo de código, consulte Administración de ventanas de aplicaciones.

Función de interoperabilidad Método de interoperabilidad de 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)

Disponible a través del Moniker de la plataforma de destino

Interfaz de interoperabilidad COM de WinRT Clase de interoperabilidad de C#
IAccountsSettingsPaneInterop (Windows.UI.ApplicationSettings) AccountsSettingsPaneInterop
IDisplayInformationStaticsInterop Se introdujo con TFM net6.0-windows10.0.22621.0 y .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 en WinUI 3

(WinRT.Interop) WindowNative

Para ver alternativas a WPF y WinForms, consulte Recuperación de un identificador de ventana (HWND).

Ejemplo de código

En este ejemplo de código se muestra cómo usar dos de las clases de interoperabilidad de C# en una aplicación de WinUI 3 (consulte Creación del primer proyecto de WinUI 3). El escenario de ejemplo se usa para mostrar un elemento Windows.Storage.Pickers.FolderPicker. Pero antes de mostrar el selector en una aplicación de escritorio, es necesario inicializarlo con el identificador (HWND) de la ventana de propietario.

  1. Puede obtener un identificador de ventana (HWND) mediante la interfaz de interoperabilidad COM de WinRT IWindowNative. Asimismo, si revisa la tabla de la sección anterior, esa interfaz se representa mediante la clase de interoperabilidad de C# WinRT.Interop.WindowNative. En este ejemplo, el objeto this es una referencia a un objeto Microsoft.UI.Xaml.Window del archivo de código subyacente de la ventana principal.
  2. Para inicializar un fragmento de interfaz de usuario con una ventana de propietario, use la interfaz de interoperabilidad de COM de winRT IInitializeWithWindow. Así pues, esa interfaz se representa mediante la clase de interoperabilidad de 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();
}

Consulte también Recuperación de un identificador de ventana (HWND) y Visualización de objetos de la interfaz de usuario de WinRT que dependen de CoreWindow.

Fondo

Las versiones anteriores de .NET Framework y .NET Core tenían información integrada de WinRT. Mediante estas versiones anteriores, podía definir una interfaz de interoperabilidad directamente en C# con el atributo ComImport, y convertir directamente una clase proyectada en esa interfaz de interoperabilidad.

Dado que WinRT es una tecnología específica de Windows, para admitir los objetivos de portabilidad y eficiencia de .NET, hemos quitado la compatibilidad con la proyección de WinRT del compilador de C# y del entorno de ejecución de .NET y la hemos movido al kit de herramientas de C#/WinRT (consulte La compatibilidad integrada con WinRT se ha quitado de .NET).

Aunque la técnica ComImport aún funciona para interfaces de interoperabilidad basadas en IUnknown, ya no funciona para interfaces basadas en IInspectable, que se usan para interoperar con WinRT.

Por lo tanto, como reemplazo, en .NET, puede usar las clases de interoperabilidad de C# que se describen en este tema.

Solución de problemas conocidos

Actualmente, no hay ningún problema conocido para las clases de interoperabilidad de C#. Para enviar comentarios o informar de otros problemas, agregue comentarios a un problema existente o envíe un nuevo problema al repositorio de WindowsAppSDK en GitHub.