Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Als C#-Desktopanwendungsentwickler können Sie in .NET C#-Interoperabilitätsklassen verwenden, die mehrere Interoperabilitätsfunktionen und Windows Runtime (WinRT) COM-Interoperabilitätsschnittstellen darstellen. Dazu gehören C#-Klassen, die IWindowNative, IInitializeWithWindow, die GetWindowIdFromWindow-Funktion und viele andere darstellen.
In diesem Thema werden die verfügbaren C#-Interoperabilitätsklassen aufgeführt und erläutert, wie sie verwendet werden. Der Abschnitt Background am Ende des Themas beschreibt, wie Interoperabilitätsschnittstellen in früheren Versionen von .NET verwendet wurden und warum die Änderung vorgenommen wurde.
Konfigurieren Sie ein .NET-Desktop-Projekt für die Verwendung der C#-Interoperabilitätsklassen
Die im nächsten Abschnitt aufgeführten C#-Interoperabilitätsklassen (Available C# interop classes) sind in .NET entweder als Teil der Windows App SDK oder über eine bestimmte Target Framework Moniker verfügbar, wie wir sehen.
In einem WinUI 3 C#-Desktop-project
Wenn Sie in Visual Studio ein neues WinUI-Projekt erstellen (siehe Erstellen Sie Ihr erstes WinUI-Projekt), ist Ihr Projekt bereits konfiguriert, und Sie können sofort mit der Verwendung aller C#-Interopklassen beginnen.
In anderen C#-Desktop-Projekttypen (WPF oder WinForms)
Für andere .NET Desktop-Projekt-Typen, wie Windows Presentation Foundation (WPF) oder Windows Forms (WinForms), müssen Sie Ihr Projekt konfigurieren, bevor Sie auf die C#-Interoperabilitätsklassen zugreifen können. Für die erste Gruppe von Klassen, die unten aufgeführt sind, müssen Sie auf die Windows App SDK verweisen. Für den zweiten Satz müssen Sie ein Target Framework Moniker konfigurieren, das auf Windows 10, Version 1809 oder höher ausgerichtet ist, wie folgt:
Öffnen Sie die Projektdatei für Ihr C# .NET-Desktopprojekt.
Ändern Sie in der Datei
.csprojdas Element TargetFramework auf eine bestimmte .NET- und Windows SDK-Version. Beispielsweise ist das folgende Element für eine .NET 6 project geeignet, die auf Windows 10, Version 2004, ausgerichtet ist.<PropertyGroup> <TargetFramework>net8.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#-Interopklassen
Note
Die folgenden Klassen erfordern das .NET 6 SDK oder höher.
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. Beispielsweise erfordert Windows.ApplicationModel.DataTransfer.DragDrop.Core.DragDropManagerInterop.GetForWindow einen IntPtr-Fensterhandle (HWND) und gibt ein CoreDragDropManager-Objekt zurück. Alle unten aufgeführten C#-Interopklassen und die zugehörigen Methoden sind statisch.
Im Rahmen der Windows App SDK verfügbar
Die Microsoft.UI.Win32Interop-Klasse implementiert die C#-Interopmethoden 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 (WinRT.Interop) WindowNative Alternativen für WPF und WinForms finden Sie unter Retrieve a window handle (HWND). |
Codebeispiel
In diesem Codebeispiel wird die Verwendung von zwei der C#-Interopklassen in einer WinUI-Anwendung veranschaulicht (siehe Create your first WinUI project). Im Beispielszenario wird ein Windows.Storage.Pickers.FolderPicker angezeigt. Vor dem Anzeigen der Auswahl in einer Desktop-App muss diese jedoch mit dem Handle (HWND) des Besitzerfensters initialisiert werden.
- Sie können ein Fensterhandle (HWND) mithilfe der IWindowNative WinRT COM-Interop-Schnittstelle abrufen. Und (in der Tabelle im vorherigen Abschnitt) wird diese Schnittstelle durch die WinRT.Interop.WindowNative C#-Interopklasse dargestellt. Hier ist das
thisObjekt ein Verweis auf ein Microsoft.UI.Xaml.Window-Objekt aus der CodeBehind-Datei des Hauptfensters. - Zum Initialisieren eines Ui-Elements mit einem Besitzerfenster verwenden Sie die Interopschnittstelle "IInitializeWithWindow WinRT COM". Diese Schnittstelle wird durch die Interop.WinRT.Interop.InitializeWithWindow C#-Interopklasse 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 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.
Background
Frühere Versionen von .NET Framework und .NET Core verfügen über integrierte Kenntnisse von WinRT. Mit diesen früheren Versionen können Sie eine Interoperabilitätsschnittstelle direkt in C# mit dem ComImport-Attribut definieren und dann direkt eine projizierte Klasse in diese Interop-Schnittstelle umwandeln.
Da WinRT eine Windows-spezifische Technologie ist, um die Portabilitäts- und Effizienzziele von .NET zu unterstützen, haben wir die WinRT-Projektionsunterstützung aus dem C#-Compiler und .NET Laufzeit aufgehoben und in die C#/WinRT Toolkit verschoben (siehe Built-In-Unterstützung für WinRT wird aus .NET entfernt).
Die ComImport-Technik funktioniert zwar weiterhin für IUnknown-basierte Interoperabilitätsschnittstellen, funktioniert aber nicht mehr für die IInspectable-basierten Schnittstellen, die für die Interoperabilität mit WinRT verwendet werden.
Als Ersatz können Sie in .NET die in diesem Thema beschriebenen C#-Interopklassen verwenden.
Problembehandlung und bekannte Probleme
Für die C#-Interoperabilitätsklassen gibt es derzeit keine bekannten Probleme. Um Feedback zu geben oder andere Probleme zu melden, fügen Sie Ihr Feedback zu einem vorhandenen Problem hinzu, oder geben Sie ein neues Problem im WindowsAppSDK GitHub Repository ein.
Zugehörige Themen
Windows developer