Az Windows-alkalmazások interop-megközelítésének kiválasztása

Windows asztali alkalmazásoknak (WinUI 3, WPF, WinForms, konzol) néha api-kat kell meghívniuk a felügyelt keretrendszeren kívül. Ez az oldal segít megérteni, hogy mikor történik, és válassza ki a megfelelő technikát.

Két API-felület, két interop minta

Windows két fő API-felületen teszi elérhetővé a funkciókat:

  • Win32 API-k – A rendszer DLL-ekből (user32.dll, stbkernel32.dllshell32.dll.) exportált klasszikus C-stílusú függvények. Ezek az alacsony szintű műveleteket, például az ablakkezelést, a fájl I/O-t, a folyamatvezérlést és a hardverhozzáférést fedik le. Ezek a Windows legkorábbi verziói óta léteznek, és továbbra is számos olyan operációsrendszer-funkció elérésének módja marad, amelyek nem rendelkeznek felügyelt egyenértékű szolgáltatásokkal.

  • Windows-futtatókörnyezet (WinRT) API-k – A Windows 8 bevezetett modern, objektumorientált API-felület (a névterek az elsővel Windows.*kezdődnek). A WinRT API-k olyan területeket fednek le, mint az értesítések, a médiarögzítés, a Bluetooth, a földrajzi helymeghatározás stb. A legtöbb WinRT API közvetlenül elérhető a .NET-ből különösebb erőfeszítés nélkül, de egyesek használata asztali alkalmazásokban korlátozott, vagy a működéshez ablakazonosítót (HWND) igényelnek.

Amikor interop-ra fog ütközni

Általában interop-ra van szükség, ha az alkalmazás-keretrendszer nem tesz közzé közvetlenül egy adott operációsrendszer-képességet. Gyakori forgatókönyvek a következők:

Scenario Melyik API-felület Example
Címsor vagy ablak elhelyezésének testreszabása Win32 SetWindowPos, DwmExtendFrameIntoClientArea
Egy ablak beállítása „mindig legfelül”-ként, vagy a Z-sorrend szabályozása Win32 SetWindowPos és HWND_TOPMOST
Fájlválasztó vagy megosztási párbeszédpanel megjelenítése a WinUI 3-ból WinRT (HWND-t igényel) FileOpenPicker és InitializeWithWindow
Rendszermemória vagy teljesítményszámlálók olvasása Win32 GlobalMemoryStatusEx, QueryPerformanceCounter
Globális gyorsbillentyű regisztrálása Win32 RegisterHotKey
Bejelentési értesítés küldése (csomagolatlan alkalmazás) WinRT (az App SDK-val) AppNotificationManager

Ezekben az esetekben normál C#-kódot ír, de egy interoperabilitási rétegen keresztül éri el a Windowst. Az alábbi témakörök végigvezetik az egyes megközelítéseken.

Útmutató döntésekhez

Szükségem van... Ajánlott megközelítés Téma
Win32 API meghívása (user32, kernel32, shell32 stb.) a C-ből# A CsWin32 forrásgenerátor használata – típusbiztos, kézzel írt aláírások nélkül Win32 API-k meghívása a C# (CsWin32) szolgáltatásból
WinRT-objektum inicializálása ablakfogóponttal (jelölők, párbeszédpanelek, felhasználói felület megosztása) Használja a .NET WinRT COM interoperabilitási osztályokat (InitializeWithWindow, WindowNative stb.) .NET-alkalmazásközi API-k meghívása
Ellenőrizze, hogy a WinRT API működik-e asztali (nem UWP) alkalmazásban Tekintse meg a korlátozások és alternatívák listáját Asztali alkalmazásokban nem támogatott WinRT API-k
Egy teljes WinUI 3-példa , amely testre szab egy ablakot Win32-hívások használatával Kövesse a teljes útmutatót Útmutató: WinUI 3 alkalmazás Win32 interop-tal

Gyors folyamatábra

  1. Az API WinRT-névtérben Windows.* van?

  2. Ez egy Win32/native API (egy Windows SDK-fejlécfájlban van definiálva)?