Pilih pendekatan interop Anda untuk aplikasi Windows

Windows aplikasi desktop (WinUI 3, WPF, WinForms, konsol) terkadang perlu memanggil API di luar kerangka kerja terkelola mereka. Halaman ini membantu Anda memahami kapan itu terjadi dan memilih teknik yang tepat.

Dua permukaan API, dua pola interop

Windows mengekspos fungsionalitas melalui dua permukaan API utama:

  • API Win32 — Fungsi gaya C klasik yang diekspor dari DLL sistem (user32.dll, , kernel32.dllshell32.dll, dll.). Ini mencakup operasi tingkat rendah seperti manajemen jendela, I/O file, kontrol proses, dan akses perangkat keras. Mereka sudah ada sejak versi paling awal Windows dan tetap menjadi cara untuk mengakses banyak fitur OS yang tidak memiliki pengelolaan yang setara.

  • Windows Runtime (WinRT) API — Permukaan API modern berorientasi objek (namespace dimulai dengan Windows.*) yang diperkenalkan dengan Windows 8. API WinRT mencakup area seperti pemberitahuan, pengambilan media, Bluetooth, geolokasi, dan banyak lagi. Sebagian besar API WinRT dapat diakses langsung dari .NET tanpa upaya khusus, tetapi beberapa memiliki batasan di aplikasi desktop atau memerlukan handel jendela (HWND) untuk berfungsi.

Saat Anda menemui interop

Anda biasanya memerlukan interop saat kerangka kerja aplikasi Anda tidak mengekspos kemampuan OS tertentu secara langsung. Skenario umum meliputi:

Skenario Cakupan API yang mana Example
Mengkustomisasi bilah judul atau penempatan jendela Win32 SetWindowPos, DwmExtendFrameIntoClientArea
Atur jendela sebagai "always on top" atau kontrol Z-order Win32 SetWindowPos dengan HWND_TOPMOST
Perlihatkan pemilih file atau dialog berbagi dari WinUI 3 WinRT (perlu HWND) FileOpenPicker dengan InitializeWithWindow
Membaca memori sistem atau penghitung kinerja Win32 GlobalMemoryStatusEx, QueryPerformanceCounter
Daftarkan tombol pintas global Win32 RegisterHotKey
Kirim notifikasi toast (aplikasi tanpa paket) WinRT (dengan App SDK) AppNotificationManager

Dalam semua kasus ini, Anda menulis kode C# normal tetapi memanggil ke Windows melalui lapisan interop. Topik di bawah ini memandu Anda melalui setiap pendekatan.

Panduan keputusan

Aku harus... Pendekatan yang disarankan Topic
Panggil WIN32 API (user32, kernel32, shell32, dll.) dari C# Gunakan generator sumber CsWin32 — jenis aman, tidak ada tanda tangan tertulis tangan Memanggil API Win32 dari C# (CsWin32)
Menginisialisasi objek WinRT dengan handle jendela (pemilih, dialog, antarmuka berbagi) Gunakan kelas interop .NET WinRT COM (InitializeWithWindow, , WindowNativedll.) Panggil API interop dari aplikasi .NET
Periksa apakah WinRT API berfungsi di aplikasi desktop (non-UWP) Lihat daftar pembatasan dan alternatif API WinRT tidak didukung di aplikasi desktop
Lihat contoh WinUI 3 lengkap yang menyesuaikan jendela menggunakan panggilan Win32 Ikuti panduan dari awal hingga akhir Panduan: aplikasi WinUI 3 dengan interoperabilitas Win32

Diagram alur cepat

  1. Apakah API berada di Windows.* namespace WinRT?

  2. Apakah itu API Win32/native (didefinisikan dalam header SDK Windows)?

    • Ya → Gunakan CsWin32 untuk menghasilkan binding P/Invoke yang aman terhadap tipe.
    • Tidak → Ini mungkin antarmuka COM atau pustaka asli pihak ketiga. Lihat interop .NET dengan kode asli untuk panduan P/Invoke umum.