Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Některé objekty WinRT (výběr souborů, dialogy, sdílené uživatelské rozhraní) potřebují před prací v desktopové aplikaci popisovač okna (HWND). Projekce .NET těchto rozhraní WinRT COM pro interoperabilitu vám poskytují typově bezpečné třídy C#, například WinRT.Interop.InitializeWithWindow a WinRT.Interop.WindowNative, takže nemusíte psát ruční volání COM QueryInterface.
Tip
Pokud potřebujete volat rozhraní API Win32 (jádro32 , user32 atd.) z jazyka C#, použijte místo toho CsWin32 . Tato stránka se zabývá pouze rozhraními COM interoperability WinRT.
Toto téma obsahuje seznam dostupných tříd spolupráce jazyka C# a ukazuje, jak je používat. Část Background na konci tématu popisuje, jak byla rozhraní vzájemné spolupráce použita v předchozích verzích .NET a proč byla změna provedena.
Nakonfigurujte projekt .NET pro desktop pro použití tříd interoperability jazyka C#
Třídy interoperability C# uvedené v další části (Dostupné třídy interoperability jazyka C#) jsou k dispozici v .NET buď jako součást Windows App SDK, nebo také pomocí konkrétního Target Framework Monikeru, jak uvidíme.
V desktopovém projektu WinUI 3 v C#
Když ve Visual Studiu vytvoříte nový projekt WinUI (viz Vytvořte svůj první projekt WinUI), váš projekt je již nakonfigurován a můžete ihned začít používat všechny C# interop třídy.
V jiných typech desktopových projektech C# (WPF (Windows Presentation Foundation) nebo WinForms)
U jiných typů .NET desktopových projektů, jako jsou Windows Presentation Foundation (WPF (Windows Presentation Foundation)) nebo model Windows Forms (WinForms), musíte projekt nakonfigurovat, abyste mohli přistupovat k třídám interoperability jazyka C#. Pro první sadu tříd uvedených níže budete muset odkazovat na Windows App SDK. Pro druhou sadu budete muset nakonfigurovat Moniker cílového rámce, který cílí na Windows 10, verzi 1809 nebo novější, například takto:
Otevřete soubor projektu .NET desktopového projektu v jazyce C#.
V souboru
.csprojupravte element TargetFramework tak, aby cílil na konkrétní verzi .NET a sady Windows SDK. Například následující prvek je vhodný pro projekt .NET 8, který cílí na Windows 10 verze 2004.<PropertyGroup> <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework> </PropertyGroup>
Další informace, včetně seznamu dalších podporovaných hodnot, najdete v tématu Použití možnosti Moniker cílového rámce.
Dostupné třídy interoperability jazyka C#
Note
Následující třídy vyžadují sadu .NET 6 SDK nebo novější.
Tady jsou dostupné třídy interoperability jazyka C#, mapované ze svých základních interoperabilních funkcí nebo z rozhraní pro spolupráci WinRT nebo COM. Každá uvedená třída implementuje funkci/metody svého rozhraní API pro spolupráci a poskytuje typově bezpečné obálky pro parametry a návratové hodnoty. Například Windows.ApplicationModel.DataTransfer.DragDrop.Core.DragDropManagerInterop.GetForWindow vyžaduje parametr popisovač okna IntPtr (HWND) a vrátí objekt CoreDragDropManager . Všechny níže uvedené třídy spolupráce jazyka C# a přidružené metody jsou statické.
K dispozici jako součást Windows App SDK
Třída Microsoft.UI.Win32Interop implementuje metody spolupráce jazyka C# v tabulce níže. Příklad kódu najdete v tématu Správa oken aplikací.
| Interop-funkce | Metoda spolupráce jazyka 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) |
K dispozici prostřednictvím identifikátoru cílového rámce
| Rozhraní interop COM pro WinRT | C# interop třída |
|---|---|
| IAccountsSettingsPaneInterop | (Windows.UI.ApplicationSettings) AccountsSettingsPaneInterop |
| IDisplayInformationStaticsInterop | Zavedeno s TFM net6.0-windows10.0.22621.0 a .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 | Pouze WinUI (WinRT.Interop) WindowNative Alternativy pro WPF (Windows Presentation Foundation) a WinForms naleznete v Retrieve popisovač oken (HWND). |
Příklad kódu
Tento příklad kódu ukazuje použití dvou interoperability tříd jazyka C# v aplikaci WinUI (viz Vytvořit svůj první WinUI projekt). Příkladem scénáře je zobrazení Windows.Storage.Pickers.FolderPicker. Ale před zobrazením výběrového okna v aplikaci pro stolní počítače je nutné ho inicializovat pomocí úchytu (HWND) okna vlastníka.
- Pomocí rozhraní WinRT COM interop IWindowNative můžete získat úchyt okna (HWND). A (při pohledu do tabulky v předchozí části), že rozhraní je reprezentováno C# třídy interop WinRT.Interop.WindowNative. Zde je objekt
thisreferencí na objekt Microsoft.UI.Xaml.Window ze souboru hlavního okna kódu na pozadí. - Chcete-li inicializovat část uživatelského rozhraní s oknem vlastníka, použijte WinRT rozhraní interoperability COM IInitializeWithWindow. A toto rozhraní je zobrazeno třídou C# interop 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 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();
}
Viz také Získat úchyt okna (HWND) a Zobrazit objekty uživatelského rozhraní WinRT, které závisejí na CoreWindow.
Background
Předchozí verze .NET Framework a .NET Core měly integrované znalosti WinRT. S těmito předchozími verzemi můžete definovat rozhraní vzájemné spolupráce přímo v jazyce C# pomocí atributu ComImport a pak přímo přetypovat projektovanou třídu do tohoto rozhraní vzájemné spolupráce.
Vzhledem k tomu, že WinRT je technologie specifická pro Windows, abychom podpořili cíle přenositelnosti a efektivity .NET, zvedli jsme podporu projekce WinRT z kompilátoru jazyka C# a .NET runtime a přesunuli jsme ji do C#/WinRT toolkit (viz podpora Built-in pro WinRT je odebrána z .NET).
I když technika ComImport stále funguje pro rozhraní vzájemné spolupráce založené na IUnknown, už nefunguje pro rozhraní IInspectable, která se používají pro spolupráci s WinRT.
Jako náhradu můžete v .NET využít třídy interoperability jazyka C#popsané v tomto tématu.
Řešení potíží a známé problémy
V současné době neexistují žádné známé problémy pro třídy interoperability jazyka C#. Pokud chcete poskytnout zpětnou vazbu nebo nahlásit jiné problémy, přidejte zpětnou vazbu k existujícímu problému nebo vytvořte nový problém v úložišti WindowsAppSDK GitHub.
Související témata
- Volba přístupu k interoperabilitě
- Volání rozhraní API Win32 z C# (CsWin32)
- Vytvořte svůj první projekt WinUI
- Správa oken aplikací
- Načtení úchytu okna (HWND)
- Zobrazení objektů uživatelského rozhraní WinRT, které závisí na CoreWindow
- C#/Win32 P/Invoke Source Generator (CsWin32)
- Nástroj pro projekce C#/WinRT (CsWinRT)
- Interoperabilita .NET s nativním kódem
Windows developer