Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A C#/WinRT egy NuGet-csomagú eszközkészlet, amely Windows Runtime (WinRT) előrejelzési támogatást biztosít a C# nyelvhez. A projection assembly egy együttműködő szerelvény, amely lehetővé teszi a WinRT API-k természetes és ismerős módon történő programozását a célnyelven. A C#/WinRT-vetítés elrejti a C# és a WinRT-felületek közötti interopció részleteit, és számos WinRT-típus megfeleltetését biztosítja a megfelelő .NET-ekvivalenseknek, például sztringeknek, URI-knak, általános értéktípusoknak és általános gyűjteményeknek.
A C#/WinRT jelenleg támogatja a WinRT API-k használatát a Target Framework Monikers (TFM-ek) használatával a .NET-ben. Ha a TFM-et egy adott Windows SDK-verzióval állítja be, hivatkozásokat ad a C#/WinRT által létrehozott Windows SDK-vetítésre és futtatókörnyezet-szerelvényekre.
A C#/WinRT NuGet csomag lehetővé teszi saját WinRT interop szerelvények létrehozását és hivatkozását a .NET-felhasználók számára. A legújabb C#/WinRT-verzió a WinRT-típusok C#-ban való készítésének előnézetét is tartalmazza.
További információ: C#/WinRT GitHub-adattár.
A C#/WinRT motivációja
A .NET (korábbi nevén .NET Core) egy nyílt forráskódú, platformfüggetlen futtatókörnyezet, amely eszköz-, felhő- és IoT-alkalmazások készítésére használható.
A .NET-keretrendszer és a .NET Core korábbi verziói beépített ismeretekkel rendelkeztek a WinRT-ről – egy Windows-specifikus technológiáról. A .NET 6+ hordozhatósági és hatékonysági céljainak támogatása érdekében eltávolítottuk a WinRT-vetítés támogatását a .NET-fordítóból és a futtatókörnyezetből, és áthelyeztük a C#/WinRT eszközkészletbe (lásd a WinRT beépített támogatását a .NET-ből). A C#/WinRT célja, hogy paritásos legyen a C#-fordító és a .NET-futtatókörnyezet korábbi verziói által biztosított beépített WinRT-támogatás. További részletekért tekintse meg a Windows futtatókörnyezet típusainak .NET-leképezéseit.
A C#/WinRT a Windows App SDK összetevőit is támogatja, beleértve a WinUI-t is. A Windows App SDK natív Microsoft felhasználói felületi vezérlőket és más natív összetevőket emel ki az operációs rendszerből. Ez lehetővé teszi, hogy az alkalmazásfejlesztők a Legújabb vezérlőket és összetevőket használják a Windows 10 1809-es és újabb verzióiban.
Végül a C#/WinRT egy általános eszközkészlet, amely más olyan forgatókönyvek támogatására szolgál, ahol a WinRT beépített támogatása nem érhető el a C# fordítóban vagy a .NET-futtatókörnyezetben.
Mik az újdonságok?
A legújabb C#/WinRT-kiadások a Github adattár kibocsátási megjegyzésoldalán találhatók.
Usage
A C#/WinRT NuGet-csomag C#-előrejelzések (más néven interop szerelvények) létrehozására használható a WinRT-összetevőkből és a C#/WinRT-összetevők létrehozásában. A C#/WinRT használati forgatókönyveivel kapcsolatos további részletekért tekintse meg a tárházban található használati útmutatót .
Interop-szerelvény létrehozása és terjesztése
A WinRT API-k a Windows Metadata (WinMD) fájlokban vannak definiálva. A C#/WinRT NuGet-csomag (Microsoft.Windows.CsWinRT) tartalmazza a C#/WinRT fordítót,cswinrt.exe, amellyel WinMD-fájlokat dolgozhat fel és .NET C# kódot hozhat létre. A C#/WinRT ezeket a forrásfájlokat egy interop-szerelvénybe fordítja, hasonlóan ahhoz, ahogyan a C++/WinRT fejléceket hoz létre a C++ nyelvi kivetítéshez. Ezután eloszthatja a C#/WinRT interop-szerelvényt a .NET-alkalmazások implementációs szerelvényével együtt, amely általában NuGet-csomagként használható.
Az interop-szerelvények létrehozásának és terjesztésének további részleteiért lásd: C#-kivetítés létrehozása C++/WinRT-összetevőből, terjesztés NuGet for .NET-alkalmazásokhoz.
Interop-szerelvény hivatkozása
A C#/WinRT interop szerelvényekre általában alkalmazásprojektek hivatkoznak. Erre viszont hivatkozhatnak közbenső interop assemblyk. A WinUI interop szerelvény például a Windows SDK interop szerelvényre hivatkozik.
Ha egy külső WinRT-összetevőt hivatalos interop-szerelvény nélkül terjeszt, az alkalmazásprojektek követhetik az interop-szerelvény létrehozásának eljárását saját privát vetítési források létrehozásához. Ezt a megközelítést nem javasoljuk, mert ütköző, azonos típusú előrejelzéseket hozhat létre egy folyamaton belül. A NuGet-csomagolás a szemantikai verziókövetési sémát követve ennek megelőzésére lett kialakítva. Előnyben részesítik a hivatalos külső interop szerelvényt.
Beágyazott támogatás WinRT-típusokhoz (előzetes verzió)
A C#/WinRT 1.4.1-es verziójától kezdve a támogatás magában foglalja a Windows SDK kivetítési és futtatókörnyezeti források beágyazását a .NET és a .NET Standard 2.0 verzióhoz is, az Ön könyvtárának vagy alkalmazásának kimenetébe. Ez akkor hasznos, ha a Windows SDK-típusok használata önálló. A beágyazott támogatás eltávolítja a WinRT.Runtime.dll és Microsoft.Windows.SDK.NET.dll függőségeit, ami csökkenti az erőforrástár vagy az alkalmazás kimenetének méretét. Emellett lehetővé teszi a könyvtárfejlesztők számára, hogy alsó szintű támogatást nyújtsanak, és szükségtelenné teszik a többhelyes célzást.
További részletekért tekintse meg a C#/WinRT beágyazott dokumentációját az adattárban.
WinRT-típus aktiválása
A C#/WinRT támogatja az operációs rendszer által üzemeltetett WinRT-típusok aktiválását, valamint külső összetevőket, például a Win2D-t. Az asztali alkalmazásokban a harmadik féltől származó összetevők aktiválásának támogatása regisztráció nélküli WinRT-aktiválással engedélyezve van (lásd: Nem csomagolt asztali alkalmazások fejlesztése a Windows futtatókörnyezet összetevőivel) a Windows 10 1903-es és újabb verzióiban. A Natív C++-összetevőknek a Windows Asztali kompatibilis tulajdonságot True értékre kell állítaniuk a projekt tulajdonságain vagy a .vcxproj fájlon keresztül, hogy hivatkozhassanak a Microsoft.VCLibs.Desktop bináris fájljaira, és továbbíthassák azt a fogyasztó alkalmazásoknak. Ellenkező esetben a VCRT Forwarders-csomagra az alkalmazások felhasználásával lesz szükség, ha az összetevő csak az UWP-alkalmazásokat célozza meg.
A C#/WinRT emellett aktiválási tartalék elérési utat is biztosít, ha a Windows nem tudja aktiválni a típust a fent leírtak szerint. Ebben az esetben a C#/WinRT megkísérli megkeresni a natív implementációs DLL-t a teljes típusnév alapján, fokozatosan eltávolítva az elemeket. A tartalék logika például a Contoso.Controls.Widget típust a következő modulokból próbálja meg egymás után aktiválni:
- Contoso.Controls.Widget.dll
- Contoso.Controls.dll
- Contoso.dll
A C#/WinRT a LoadLibrary alternatív keresési sorrendjét használja egy implementációs DLL megkereséséhez. Az erre a tartalék viselkedésre támaszkodó alkalmazásnak az alkalmazásmodul mellé kell csomagolnia a megvalósítási DLL-t.
Gyakori hibák és hibaelhárítás
Hiba: "A Windows metadata nem megadva vagy nem észlelhető."
A Windows metaadatait a
<CsWinRTWindowsMetadata>projekttulajdonság használatával adhatja meg, például:<CsWinRTWindowsMetadata>10.0.19041.0</CsWinRTWindowsMetadata>A C#/WinRT 1.2.1-es és ennél újabb verziókban ezen tulajdonság alapértelmezett értéke
TargetPlatformVersion, amely a Windows SDK-verzióból származik, amit aTargetFrameworktulajdonságban adnak meg.CS0246-os hiba: A "Windows" típus- vagy névtérnév nem található (hiányzik egy használatirányelv vagy egy szerelvényhivatkozás?)
A hiba elhárításához szerkessze a tulajdonságot
<TargetFramework>egy adott Windows-verzió megcélzásához, például:<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>A tulajdonság megadásával kapcsolatos további részletekért tekintse meg a
<TargetFramework>kapcsolatos dokumentumokat.System.InvalidCastException az
ComImportattribútummal rendelkező felületre történő kasztoláskorAmikor egy objektumot egy
ComImportattribútummal rendelkező felületre alakít át, a.As<>operátort kell használnia ahelyett, hogy explicit kifejezést használna. Például:someObject.As<SomeComImportInterface>További részletekért tekintse meg a COM interop útmutatót.
System.Runtime.InteropServices.COMException: Osztály nincs regisztrálva (0x80040154 (REGDB_E_CLASSNOTREG))
- Ha ez a kivétel c++/WinRT-összetevőből származó C#/WinRT-vetítés használatakor jelenik meg, győződjön meg arról, hogy az összetevő True értékre állította a Windows Asztali kompatibilis tulajdonságot a projekt tulajdonságain vagy a
.vcxprojfájlon keresztül.
- Ha ez a kivétel c++/WinRT-összetevőből származó C#/WinRT-vetítés használatakor jelenik meg, győződjön meg arról, hogy az összetevő True értékre állította a Windows Asztali kompatibilis tulajdonságot a projekt tulajdonságain vagy a
.NET SDK-verziószámozási hibák
Az alábbi hibák vagy figyelmeztetések jelenhetnek meg egy olyan projektben, amely egy korábbi .NET SDK-verzióval készült, mint bármelyik függősége.
| Hiba vagy figyelmeztető üzenet | Reason |
|---|---|
| Figyelmeztetés MSB3277: Ütközések találhatók a WinRT.Runtime különböző verziói vagy Microsoft.Windows.SDK.NET között, amelyek nem oldhatók fel. | Ez az összeállítási figyelmeztetés akkor fordul elő, ha olyan kódtárra hivatkozik, amely a Windows SDK-típusokat teszi elérhetővé az API-felületén. |
| CS1705-ös hiba: A AssemblyName1 szerelvény a TypeName szerelvényt használja, amely magasabb verziójú, mint a hivatkozott "AssemblyName2" szerelvény | Ez a build fordítási hibája akkor fordul elő, ha a könyvtárban megadott Windows SDK-típusokra hivatkozik és használja őket. |
| System.IO.FileLoadException | Ez a futtatókörnyezeti hiba akkor fordulhat elő, ha bizonyos API-kat hív meg egy olyan kódtárban, amely nem teszi elérhetővé a Windows SDK-típusok használatát. |
A hibák elhárításához frissítse a .NET SDK-t a legújabb verzióra. Ezzel biztosítja, hogy az alkalmazás által használt futtatókörnyezeti és Windows SDK-szerelvényverziók kompatibilisek legyenek az összes függőséggel. Ezek a hibák a .NET SDK korai karbantartási/funkciófrissítései esetén fordulhatnak elő, mivel a futtatókörnyezeti javításokhoz szükség lehet a szerelvényverziók frissítésére.
Ismert problémák
Az ismert problémákat és a kompatibilitástörő változásokat a C#/WinRT GitHub adattárban találja.
Ha funkcionális problémákat tapasztal a C#/WinRT NuGet-csomaggal, a cswinrt.exe fordítóval vagy a létrehozott kivetítési forrásokkal kapcsolatban, küldje el nekünk a problémákat a C#/WinRT-problémák oldalán.
További erőforrások
Windows developer