Wybierz podejście do interoperacyjności dla aplikacji systemu Windows

Windows aplikacje klasyczne (WinUI 3, WPF, WinForms, konsola) czasami muszą wywoływać interfejsy API poza ich zarządzaną strukturą. Ta strona pomaga zrozumieć, kiedy tak się dzieje, i wybrać odpowiednią technikę.

Dwa interfejsy API, dwa wzorce interoperacyjności

Windows uwidacznia funkcje za pomocą dwóch głównych powierzchni interfejsu API:

  • Interfejsy API Win32 — klasyczne funkcje języka C wyeksportowane z bibliotek DLL systemu (user32.dll, kernel32.dll, shell32.dllitp.). Obejmują one operacje niskiego poziomu, takie jak zarządzanie oknami, operacje we/wy plików, kontrola procesu i dostęp do sprzętu. Istniały one od najwcześniejszych wersji Windows i pozostają sposobem uzyskiwania dostępu do wielu funkcji systemu operacyjnego, które nie mają zarządzanego odpowiednika.

  • interfejsy API środowisko wykonawcze systemu Windows (WinRT) — nowoczesna, zorientowana na obiekt powierzchnia interfejsu API (przestrzeń nazw rozpoczynająca się od Windows.*) wprowadzona z Windows 8. Interfejsy API WinRT obejmują obszary, takie jak powiadomienia, przechwytywanie multimediów, Bluetooth, geolokalizacja i inne. Większość interfejsów API WinRT jest bezpośrednio dostępna z .NET bez specjalnego nakładu pracy, ale niektóre z nich mają ograniczenia w aplikacjach klasycznych lub wymagają obsługi okien (HWND) do działania.

Kiedy zetkniesz się z interoperacyjnością

Zwykle potrzebna jest współpraca, gdy platforma aplikacji nie uwidacznia konkretnej funkcji systemu operacyjnego bezpośrednio. Typowe scenariusze obejmują:

Scenario Która powierzchnia interfejsu API Example
Dostosowywanie położenia paska tytułu lub okna Win32 SetWindowPos, DwmExtendFrameIntoClientArea
Ustawianie okna jako "zawsze na górze" lub kontrolowanie kolejności Z Win32 SetWindowPos Z HWND_TOPMOST
Wyświetlanie okna dialogowego selektora plików lub udostępniania w WinUI 3 WinRT (wymaga HWND) FileOpenPicker Z InitializeWithWindow
Odczytywanie liczników pamięci systemowej lub wydajności Win32 GlobalMemoryStatusEx, QueryPerformanceCounter
Rejestrowanie globalnego klucza dostępu Win32 RegisterHotKey
Wyślij powiadomienie wyskakujące (aplikacja bez pakietu) WinRT (z zestawem SDK aplikacji) AppNotificationManager

We wszystkich tych przypadkach piszesz zwykły kod C#, ale odwołujesz się do systemu Windows za pośrednictwem warstwy interoperacyjnej. W poniższych tematach przedstawiono poszczególne podejścia.

Przewodnik po decyzjach

Muszę... Zalecane podejście Temat
Wywołaj interfejs API Win32 (user32, kernel32, shell32 itp.) z poziomu języka C# Korzystanie z generatora źródłowego CsWin32 — bezpieczne, bez ręcznie napisanych podpisów Wywoływanie interfejsów API Win32 z poziomu języka C# (CsWin32)
Inicjowanie obiektu WinRT za pomocą uchwytu okna (selektory, okna dialogowe, udostępnianie interfejsu użytkownika) Używać klas COM interop dla platformy .NET WinRT (InitializeWithWindow, WindowNative, itp.) Wywołaj API międzyoperacyjne z aplikacji .NET
Sprawdzanie, czy interfejs API WinRT działa w aplikacji klasycznej (nienależące do platformy UWP) Zapoznaj się z ograniczeniami i listą alternatyw Interfejsy API WinRT, które nie są obsługiwane w aplikacjach klasycznych
Zobacz kompletny przykład winUI 3 , który dostosowuje okno przy użyciu wywołań Win32 Przejdź przez przewodnik krok po kroku Instruktaż: aplikacja WinUI 3 z interoperacyjnością Win32

Szybki diagram

  1. Czy interfejs API znajduje się w Windows.* przestrzeni nazw WinRT?

  2. Czy jest to interfejs API Win32/natywny (zdefiniowany w nagłówku zestawu SDK Windows)?

    • Tak → użyj csWin32 , aby wygenerować powiązania P/Invoke bezpieczne dla typu.
    • Nie → Może to być interfejs COM lub biblioteka natywna innej firmy. Aby uzyskać ogólne wskazówki dotyczące P/Invoke, zobacz .NET — współdziałanie z kodem natywnym.