Memanggil API interop dari aplikasi .NET

Sebagai pengembang aplikasi desktop C#, di .NET Anda dapat menggunakan kelas interop C# yang mewakili beberapa fungsi interoperabilitas dan antarmuka interoperabilitas Windows Runtime (WinRT) COM. Ini termasuk kelas C# yang mewakili IWindowNative, IInitializeWithWindow, fungsi GetWindowIdFromWindow, dan banyak lainnya.

Topik ini mencantumkan kelas interop C# yang tersedia, dan menunjukkan cara menggunakannya. Bagian Latar Belakang di akhir topik menjelaskan bagaimana antarmuka interop digunakan dalam versi .NET sebelumnya, dan mengapa perubahan dilakukan.

Mengonfigurasi proyek desktop .NET untuk menggunakan kelas interop C#

Kelas interop C# yang tercantum di bagian berikutnya (Kelas interop C# yang tersedia) tersedia di .NET baik sebagai bagian dari SDK Aplikasi Windows, atau lainnya dengan menggunakan Moniker Kerangka Kerja Target tertentu, seperti yang akan kita lihat.

Dalam proyek desktop WinUI 3 C#

Saat Anda membuat proyek WinUI 3 baru di Visual Studio (lihat Membuat proyek WinUI 3 pertama Anda), proyek Anda sudah dikonfigurasi, dan Anda dapat mulai menggunakan semua kelas interop C# segera.

Di jenis proyek desktop C# lainnya (WPF atau WinForms)

Untuk jenis proyek desktop .NET lainnya—seperti Windows Presentation Foundation (WPF) atau Formulir Windows (WinForms)—Anda harus mengonfigurasi proyek anda sebelum dapat mengakses kelas interop C#. Untuk set kelas pertama yang tercantum di bawah ini, Anda harus mereferensikan SDK Aplikasi Windows. Untuk set kedua, Anda harus mengonfigurasi Moniker Kerangka Kerja Target yang menargetkan Windows 10, versi 1809 atau yang lebih baru, seperti ini:

  1. Buka file proyek untuk proyek desktop C# .NET Anda.

  2. .csproj Dalam file, ubah elemen TargetFramework untuk menargetkan versi .NET dan Windows SDK tertentu. Misalnya, elemen berikut sesuai untuk proyek .NET 6 yang menargetkan Windows 10, versi 2004.

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

Untuk informasi selengkapnya—termasuk daftar nilai lain yang didukung—lihat Menggunakan opsi Moniker Kerangka Kerja Target.

Kelas interop C# yang tersedia

Catatan

Kelas di bawah ini memerlukan .NET 6 SDK atau yang lebih baru.

Berikut adalah kelas interop C# yang tersedia, dipetakan dari fungsi interop yang mendasar atau antarmuka interop WinRT COM. Setiap kelas yang tercantum mengimplementasikan fungsi/metode API interop yang mendasarnya, dan menyediakan pembungkus jenis yang aman untuk parameter dan nilai pengembalian. Misalnya, Windows.ApplicationModel.DataTransfer.DragDrop.Core.DragDropManagerInterop.GetForWindow memerlukan parameter handle jendela IntPtr (HWND), dan mengembalikan objek CoreDragDropManager. Semua kelas interop C# di bawah ini dan metode terkait statis.

Tersedia sebagai bagian dari SDK Aplikasi Windows

Kelas Microsoft.UI.Win32Interop mengimplementasikan metode interop C# dalam tabel di bawah ini. Untuk contoh kode, lihat Mengelola jendela aplikasi.

Fungsi interop Metode interop 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)

Tersedia melalui Target Framework Moniker

Antarmuka interop WinRT COM Kelas interop C#
IAccounts Pengaturan PaneInterop Akun (Windows.UI.Application Pengaturan)Pengaturan PaneInterop
IDisplayInformationStaticsInterop Diperkenalkan dengan TFM net6.0-windows10.0.22621.0 dan .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
IUIView Pengaturan Interop (Windows.UI.ViewManagement) UIView Pengaturan Interop
IUserConsentVerifierInterop (Windows.Security.Credentials.UI) UserConsentVerifierInterop
IWebAuthenticationCoreManagerInterop (Windows.Security.Authentication.Web.Core) WebAuthenticationCoreManagerInterop
IWindowNative Hanya WinUI 3

(WinRT.Interop) WindowNative

Untuk alternatif untuk WPF dan WinForms, lihat Mengambil handel jendela (HWND).

Contoh kode

Contoh kode ini menunjukkan cara menggunakan dua kelas interop C# dalam aplikasi WinUI 3 (lihat Membuat proyek WinUI 3 pertama Anda). Contoh skenarionya adalah menampilkan Windows.Storage.Pickers.FolderPicker. Tetapi sebelum menampilkan pemilih di aplikasi desktop, perlu untuk menginisialisasinya dengan handel (HWND) jendela pemilik.

  1. Anda dapat memperoleh handel jendela (HWND) dengan menggunakan antarmuka interop IWindowNative WinRT COM. Dan (melihat tabel di bagian sebelumnya) antarmuka tersebut diwakili oleh kelas interop WinRT.Interop.WindowNative C#. Di sini, this objek adalah referensi ke objek Microsoft.UI.Xaml.Window dari file kode jendela utama di belakang.
  2. Untuk menginisialisasi sepotong UI dengan jendela pemilik, Anda menggunakan antarmuka interop IInitializeWithWindow WinRT COM. Dan antarmuka tersebut diwakili oleh kelas interop WinRT.Interop.InitializeWithWindow 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 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();
}

Lihat juga Mengambil handel jendela (HWND) dan Menampilkan objek UI WinRT yang bergantung pada CoreWindow.

Latar belakang

Versi sebelumnya dari .NET Framework dan .NET Core memiliki pengetahuan bawaan tentang WinRT. Dengan versi sebelumnya, Anda dapat menentukan antarmuka interop langsung di C# dengan atribut ComImport, dan kemudian langsung mentransmisikan kelas yang diproyeksikan ke antarmuka interop tersebut.

Karena WinRT adalah teknologi khusus Windows, untuk mendukung tujuan portabilitas dan efisiensi .NET, kami mengangkat dukungan proyeksi WinRT dari kompilator C# dan runtime .NET, dan memindahkannya ke toolkit C#/WinRT (lihat Dukungan bawaan untuk WinRT dihapus dari .NET).

Meskipun teknik ComImport masih berfungsi untuk antarmuka interop berbasis IUnknown, teknik ini tidak lagi berfungsi untuk antarmuka berbasis IInspectable yang digunakan untuk beroperasi dengan WinRT.

Jadi sebagai pengganti, dalam .NET, Anda dapat menggunakan kelas interop C# yang dijelaskan dalam topik ini.

Memecahkan masalah dan masalah yang diketahui

Saat ini tidak ada masalah yang diketahui untuk kelas interop C#. Untuk memberikan umpan balik, atau melaporkan masalah lain, tambahkan umpan balik Anda ke masalah yang ada, atau ajukan masalah baru pada repositori GitHub WindowsAppSDK.