Dela via


Anropa interop-API:er från en .NET-app

Som C#-programutvecklare kan du i .NET använda C#-interopklasser som representerar flera samverkansfunktioner och Com-samverkansgränssnitt för Windows Runtime (WinRT). Dessa omfattar C#-klasser som representerar IWindowNative, IInitializeWithWindow, funktionen GetWindowIdFromWindow och många andra.

Det här avsnittet visar de tillgängliga C#-interopklasserna och visar hur du använder dem. I avsnittet Background i slutet av avsnittet beskrivs hur interop-gränssnitt användes i tidigare versioner av .NET och varför ändringen gjordes.

Konfigurera ett .NET-skrivbordsprojekt för att använda C#-interopklasserna

C#-interopklasserna som anges i nästa avsnitt (Tillgängliga C#-interopklasser) är tillgängliga i .NET antingen som en del av Windows App SDK, eller genom att använda en viss Target Framework Moniker, som vi ser.

I ett WinUI 3 C#-skrivbordsprojekt

När du skapar ett nytt WinUI 3-projekt i Visual Studio (se Skapa ditt första WinUI 3-projekt) är projektet redan konfigurerat och du kan börja använda alla C#-interopklasser direkt.

I andra C#-skrivbordsprojekttyper (WPF eller WinForms)

För andra .NET-skrivbordsprojekttyper, till exempel Windows Presentation Foundation (WPF) eller Windows Forms (WinForms)– måste du konfigurera projektet innan du kan komma åt C#-interopklasserna. För den första uppsättningen klasser som anges nedan måste du referera till Windows App SDK. För den andra uppsättningen måste du konfigurera en Target Framework Moniker- som är avsedd för Windows 10, version 1809 eller senare, så här:

  1. Öppna projektfilen för ditt C# .NET-skrivbordsprojekt.

  2. I .csproj-filen ändrar du elementet TargetFramework för att rikta in sig på en specifik .NET- och Windows SDK-version. Följande element är till exempel lämpligt för ett .NET 6-projekt som riktar sig till Windows 10, version 2004.

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

Mer information – inklusive en lista över andra värden som stöds – finns i Använd monikeralternativet Target Framework.

Tillgängliga C#-interopklasser

Observera

Klasserna nedan kräver .NET 6 SDK eller senare.

Här är de tillgängliga C#-interopklasserna, mappade från deras underliggande interop-funktion eller WinRT COM-interop-gränssnitt. Varje listad klass implementerar funktionen/metoderna för dess underliggande interop-API och tillhandahåller typsäkra omslutningar för parametrar och returvärden. Till exempel kräver Windows.ApplicationModel.DataTransfer.DragDrop.Core.DragDropManagerInterop.GetForWindow en IntPtr-fönsterhandtag (HWND) och returnerar ett CoreDragDropManager--objekt. Alla C#-interopklasser nedan och associerade metoder är statiska.

Tillgänglig som en del av Windows App SDK

Klassen Microsoft.UI.Win32Interop implementerar interop-metoderna C# i tabellen nedan. Ett kodexempel finns i Hantera appfönster.

Interop-funktion Interop-metod för C#
GetDisplayIdFromMonitor (Microsoft.UI) DisplayId Win32Interop.GetDisplayIdFromMonitor(IntPtr hmonitor)
HämtaIkonFrånIkonId (Microsoft.UI) IntPtr Win32Interop.GetIconFromIconId(IconId iconId)
HämtaIkonIdFrånIkon (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)

Tillgänglig via Target Framework Moniker

WinRT COM-interop-gränssnitt C# interop-klass
IAccountsSettingsPaneInterop (Windows.UI.ApplicationSettings) AccountsSettingsPaneInterop
IDisplayInformationStaticsInterop Introducerades med TFM net6.0-windows10.0.22621.0 och .NET 6.0.7.

(Windows.Graphics.Display) DisplayInformationInterop
IDragDropManagerInterop (Windows.ApplicationModel.DataTransfer.DragDrop.Core) DragDropManagerInterop
IInitializeWithWindow (WinRT.Interop) InitieraMedWindow
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 Endast WinUI 3

(WinRT.Interop) WindowNative

Alternativ för WPF och WinForms finns i Hämta ett fönsterhandtag (HWND).

Kodexempel

Det här kodexemplet visar hur du använder två av C#-interopklasserna i ett WinUI 3-program (se Skapa ditt första WinUI 3-projekt). Exempelscenariot är att visa en Windows.Storage.Pickers.FolderPicker. Men innan du visar väljaren i en skrivbordsapp är det nödvändigt att initiera den med handtaget (HWND) i ägarfönstret.

  1. Du kan hämta ett fönsterhandtag (HWND) med hjälp av IWindowNative WinRT COM-interopgränssnittet. Och (i tabellen i föregående avsnitt) representeras gränssnittet av WinRT.Interop.WindowNative C# interop-klass. Här är this-objektet en referens till ett Microsoft.UI.Xaml.Window-objekt från huvudfönstrets bakomliggande kodfil.
  2. Om du vill initiera en del av användargränssnittet med ett ägarfönster använder du IInitializeWithWindow WinRT COM-interopgränssnittet. Och det gränssnittet representeras av klassen WinRT.Interop.InitializeWithWindow C# interop.
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();
}

Se även Hämta ett fönsterhandtag (HWND) och Visa WinRT-gränssnittsobjekt som är beroende av CoreWindow.

Bakgrund

Tidigare versioner av .NET Framework och .NET Core hade inbyggd kunskap om WinRT. Med dessa tidigare versioner kan du definiera ett interop-gränssnitt direkt i C# med attributet ComImport och sedan direkt casta en projicerad klass till det interop-gränssnittet.

Eftersom WinRT är en Windows-specifik teknik, för att stödja portabilitets- och effektivitetsmålen för .NET, lyfte vi WinRT-projektionsstödet från C#-kompilatorn och .NET-körningen och flyttade det till C#/WinRT toolkit (se Inbyggt stöd för WinRT tas bort från .NET).

Även om ComImport-tekniken fortfarande fungerar för IUnknown-baserade interop-gränssnitt, fungerar den inte längre för de IInspectable-baserade gränssnitt som används för samverkan med WinRT.

Som ersättning kan du i .NET använda de C#-interop-klasser som beskrivs i det här avsnittet.

Felsökning och kända problem

Det finns för närvarande inga kända problem för C#-interopklasserna. Om du vill ge feedback eller rapportera andra problem lägger du till din feedback i ett befintligt problem eller skickar ett nytt problem på github-lagringsplatsen WindowsAppSDK.