Compartir por


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

Como desarrollador de aplicaciones de escritorio de C#, en .NET puede usar clases de interoperabilidad de C# que representan varias funciones de interoperabilidad y 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. La sección Background al final del tema describe cómo se usaron las interfaces de interoperabilidad en versiones anteriores de .NET y por qué se realizó el cambio.

Configure un proyecto de escritorio de .NET para usar las clases de interoperabilidad de C#

Las clases de interoperabilidad de C# enumeradas en la sección siguiente (Available C# interop classes) están disponibles en .NET como parte del Windows App SDK, o bien mediante un Target Framework Moniker, como veremos.

En un proyecto de escritorio de WinUI 3 en C#

Al crear un nuevo proyecto WinUI en Visual Studio (consulte Crear su primer proyecto WinUI), el proyecto ya viene configurado y puede empezar a usar todas las clases de interoperabilidad de C# inmediatamente.

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

Para otros tipos de proyecto de escritorio de .NET, como Windows Presentation Foundation (WPF) o Windows Forms (WinForms), deberá configurar el proyecto antes de 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 Windows App SDK. Para el segundo conjunto, deberá configurar un Target Framework Moniker que tenga como destino Windows 10, versión 1809 o posterior, de la siguiente manera:

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

  2. En el archivo .csproj, modifique el elemento TargetFramework para orientar a una versión específica de .NET y Windows SDK. Por ejemplo, el siguiente elemento es adecuado para una .NET 6 project que tiene como destino Windows 10, versión 2004.

    <PropertyGroup>
      <TargetFramework>net8.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 de C# disponibles

Note

Las clases siguientes requieren el SDK de .NET 6 o posterior.

Estas son las clases de interoperabilidad de C#disponibles, asignadas desde su 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 IntPtr (HWND) 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 Windows App SDK

La clase Microsoft.UI.Win32Interop implementa los métodos de interoperabilidad de C# en la tabla siguiente. Para obtener un ejemplo de código, consulte Administrar 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 WinUI

(WinRT.Interop) WindowNative

Para obtener alternativas para WPF y WinForms, consulte Retrieve 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 WinUI (consulte Crear su primer proyecto de WinUI). El escenario de ejemplo es mostrar un 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 IWindowNative WinRT. Y (consultando la tabla de la sección anterior), esa interfaz está representada por la clase de interoperabilidad WinRT.Interop.WindowNative de C#. Aquí, el this objeto es una referencia a un objeto Microsoft.UI.Xaml.Window del archivo de código subyacente de la ventana principal.
  2. Para inicializar una parte de la interfaz de usuario con una ventana propietaria, utilice la interfaz de interoperabilidad WinRT COM IInitializeWithWindow. Y esa interfaz se representa mediante la clase de interoperabilidad WinRT.Interop.InitializeWithWindow de 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();
}

Consulte también Recuperar un identificador de ventana (HWND) y Mostrar objetos de interfaz de usuario de WinRT que dependen de CoreWindow.

Background

Las versiones anteriores de .NET Framework y .NET Core tenían conocimientos integrados de WinRT. Con esas versiones anteriores, podría definir una interfaz de interoperabilidad directamente en C# con el atributo ComImport y, a continuación, convertir directamente una clase proyectada a 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, elevamos la compatibilidad con la proyección de WinRT fuera del compilador de C# y .NET runtime, y lo trasladamos al C#/WinRT toolkit (consulte La compatibilidad integrada con WinRT se quita de .NET).

Aunque la técnica ComImport sigue funcionando para interfaces de interoperabilidad basadas en IUnknown, ya no funciona para las 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# descritas en este tema.

Solución de problemas y problemas conocidos

Actualmente no hay problemas conocidos para las clases de interoperabilidad de C#. Para proporcionar comentarios o notificar otros problemas, agregue sus comentarios a un problema existente o registre un nuevo problema en el repositorio WindowsAppSDK GitHub repo.