Interop APIs von einer .NET-App aufrufen

Als Entwickler von C#-Desktopanwendungen können Sie in .NET und höher C#-Interop-Klassen verwenden, die verschiedene Interoperabilitätsfunktionen und COM-Interoperabilitätsschnittstellen der Windows Runtime (WinRT) darstellen. Dazu gehören C#-Klassen, die IWindowNative, IInitializeWithWindow, die Funktion GetWindowIdFromWindow und viele andere darstellen.

In diesem Thema werden die verfügbaren C#-Interop-Klassen aufgelistet, und es wird gezeigt, wie sie verwendet werden. Im Abschnitt Hintergrund am Ende des Themas wird beschrieben, wie Interop-Schnittstellen in früheren Versionen von .NET verwendet wurden und warum die Änderung vorgenommen wurde.

Konfigurieren eines .NET-Desktop-Projekts für die Verwendung der C#-Interop-Klassen

Die im nächsten Abschnitt (Verfügbare C#-Interop-Klassen) aufgeführten C#-Interop-Klassen sind in .NET entweder als Teil des Windows App SDK oder unter Verwendung eines bestimmten Target Framework Moniker verfügbar, wie wir noch sehen werden.

In einem WinUI 3-C#-Desktopprojekt

Wenn Sie ein neues WinUI 3-Projekt in Visual Studio erstellen (siehe Erstellen Ihres ersten WinUI 3-Projekts), ist Ihr Projekt bereits konfiguriert, und Sie können alle C#-Interop-Klassen sofort verwenden.

In anderen C#-Desktopprojekttypen (WPF oder WinForms)

Für andere .NET-Desktop-Projekttypen wie Windows Presentation Foundation (WPF) oder Windows Forms (WinForms) müssen Sie Ihr Projekt konfigurieren, bevor Sie auf die C#-Interop-Klassen zugreifen können. Für die ersten unten aufgeführten Klassen müssen Sie auf das Windows App SDK verweisen. Für die zweite Gruppe müssen Sie wie folgt einen Zielframeworkmoniker konfigurieren, der auf Windows 10, Version 1809 oder höher, ausgerichtet ist:

  1. Öffnen Sie die Projektdatei für Ihr C# .NET-Desktop-Projekt.

  2. Ändern Sie in der .csproj-Datei das TargetFramework-Element so, dass es auf eine bestimmtes .NET- und Windows SDK-Version ausgerichtet ist. Das folgende Element ist zum Beispiel für ein .NET 6-Projekt geeignet, das auf Windows 10, Version 2004, ausgerichtet ist.

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

Weitere Informationen, einschließlich einer Liste anderer unterstützter Werte, finden Sie unter Verwenden der Zielframeworkmoniker-Option.

Verfügbare C#-Interop-Klassen

Hinweis

Für die folgenden Klassen ist das .NET 6 SDK oder höher erforderlich.

Hier sind die verfügbaren C#-Interop-Klassen, die von ihrer zugrunde liegenden Interop-Funktion oder WinRT COM-Interop-Schnittstelle abgebildet werden. Jede aufgelistete Klasse implementiert die Funktionen/Methoden der ihr zugrunde liegenden Interop-API und bietet typsichere Wrapper für Parameter und Rückgabewerte. Windows.ApplicationModel.DataTransfer.DragDrop.Core.DragDropManagerInterop.GetForWindow erfordert beispielsweise einen IntPtr-Fensterhandleparameter (HWND) und gibt ein CoreDragDropManager-Objekt zurück. Alle unten aufgeführten C#-Interop-Klassen und zugeordneten Methoden sind statisch.

Verfügbar als Teil des Windows App SDK

Die Microsoft.UI.Win32Interop-Klasse implementiert die C#-Interop-Methoden in der folgenden Tabelle. Ein Codebeispiel finden Sie unter Verwalten von App-Fenstern.

Interop-Funktion C#-Interop-Methode
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)

Verfügbar über den Zielframeworkmoniker

WinRT-COM-Interop-Schnittstelle C#-Interop-Klasse
IAccountsSettingsPaneInterop (Windows.UI.ApplicationSettings) AccountsSettingsPaneInterop
IDisplayInformationStaticsInterop Eingeführt mit TFM net6.0-windows10.0.22621.0 und .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 nur WinUI 3

(WinRT.Interop) WindowNative

Alternativen für WPF und WinForms finden Sie unter Abrufen eines Fensterhandles (HWND).

Codebeispiel

Dieses Codebeispiel zeigt, wie zwei der C#-Interop-Klassen in einer WinUI 3-Anwendung verwendet werden können (siehe Erstellen Ihres ersten WinUI 3-Projekts). Im Beispielszenario wird ein Windows.Storage.Pickers.FolderPicker-Element angezeigt. Vor dem Anzeigen der Auswahl in einer Desktop-App muss diese jedoch mit dem Handle (HWND) des Besitzerfensters initialisiert werden.

  1. Sie können ein Fensterhandle (HWND) erhalten, indem Sie die WinRT COM-Interop-Schnittstelle IWindowNative verwenden. Und (siehe Tabelle im vorherigen Abschnitt) diese Schnittstelle wird durch die C#-Interop-Klasse WinRT.Interop.WindowNative repräsentiert. Hier ist das this-Objekt ein Verweis auf ein Microsoft.UI.Xaml.Window-Objekt aus der CodeBehind-Datei des Hauptfensters.
  2. Um einen Teil der Benutzeroberfläche mit einem Besitzerfenster zu initialisieren, verwenden Sie die WinRT COM-Interop-Schnittstelle IInitializeWithWindow. Diese Schnittstelle wird durch die C#-Interop-Klasse WinRT.Interop.InitializeWithWindow dargestellt.
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();
}

Weitere Informationen finden Sie auch unter Abrufen eines Fensterhandles (HWND) und Anzeigen von WinRT UI-Objekten, die von CoreWindow abhängig sind.

Hintergrund

Frühere Versionen von .NET Framework und .NET Core verfügten über integrierte WinRT-Kenntnisse. Mit diesen früheren Versionen konnten Sie eine Interop-Schnittstelle direkt in C# mit dem Attribut ComImport definieren und eine projizierte Klasse direkt in diese Interop-Schnittstelle umwandeln.

Da WinRT eine Windows-spezifische Technologie ist, haben wir zur Unterstützung der Portabilitäts- und Effizienzziele von .NET die WinRT-Projektionsunterstützung aus dem C#-Compiler und der .NET-Laufzeit entfernt und in das C#/WinRT-Toolkit übernommen (siehe Integrierte Unterstützung für WinRT wird aus .NET entfernt).

Die ComImport-Technik funktioniert zwar weiterhin für IUnknown-basierte Interop-Schnittstellen, kann aber für die IInspectable-basierten Schnittstellen, die für die Interoperabilität mit WinRT verwendet werden, nicht mehr verwendet werden.

Als Ersatz können Sie daher in .NET die in diesem Thema beschriebenen C#-Interop-Klassen verwenden.

Problembehandlung und bekannte Probleme

Für die C#-Interop-Klassen sind derzeit keine Probleme bekannt. Um Feedback zu geben oder andere Probleme zu melden, können Sie im WindowsAppSDK GitHub-Repository Ihr Feedback zu einem vorhandenen Problem geben oder ein neues Problem melden.