Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A C#/WinRT egy NuGet-csomagú eszközkészlet, amely Windows-futtatókörnyezet (WinRT) vetítési támogatást nyújt 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 interfészek 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 a .NET keretében a Target Framework Monikers (TFM-ek) használatával támogatja a WinRT API-k fogyasztását. 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, hogy létrehoz és hivatkozik saját WinRT interop assembly-ket .NET felhasználók számára. A legújabb C#/WinRT-verzió támogatja a WinRT-típusok C#-ban való készítését is.
További információ: C#/WinRT GitHub adattár.
A C#/WinRT motivációja
.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 Framework és a .NET Core korábbi verziói beépített ismeretekkel rendelkeztek a WinRT-ről – Windows-specifikus technológiáról. A 6+ .NET hordozhatósági és hatékonysági céljainak támogatása érdekében eltávolítottuk a WinRT-kivetítési támogatást 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ása el lett távolítva .NET). A C#/WinRT célja, hogy paritást biztosítson a C# fordító és a .NET futtatókörnyezet korábbi verziói által biztosított beépített WinRT-támogatással. További információ: .NET Windows-futtatókörnyezet típusok leképezése.
A C#/WinRT a Windows App SDK összetevőit is támogatja, beleértve a WinUI 3-at 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 Windows 10, 1809-es és újabb kiadásokon.
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 .NET futtatókörnyezetben.
Mik az újdonságok?
A legújabb C#/WinRT-kiadások a release jegyzeteinkben az GitHub adattárban találhatók.
Usage
A C#/WinRT NuGet-csomagot lehet használni C#-vetületek (más néven interop szerelvények) generálására WinRT-összetevőkből, valamint C#/WinRT-összetevők szerkesztéséhez. A C#/WinRT használati forgatókönyveivel kapcsolatos további részletekért tekintse meg az adattárban található usage útmutatót.
Interop-szerelvény létrehozása és terjesztése
A WinRT API-k Windows Metaadatok (WinMD) fájlokban vannak definiálva. A C#/WinRT NuGet csomag (Microsoft.Windows. A 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 interoperabilitási szerelvényt és az implementációs szerelvényt, így .NET alkalmazások hivatkozhatnak rájuk, jellemzően NuGet-csomagként.
Az interop-szerelvények létrehozásával és terjesztésével kapcsolatos további részletekért lásd: C#-kivetítés létrehozása C++/WinRT-összetevőből, terjesztés NuGet-ként .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ás project a az interop-szerelvény létrehozására vonatkozó eljárást követve hozhat létre saját privát vetületforrásokat. 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
C#/WinRT 1.4.1-es verziójától támogatott a Windows SDK vetítési és futtatókörnyezeti források beágyazása a .NET és .NET Standard 2.0 könyvtárakhoz vagy alkalmazásokhoz. 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 a Microsoft.Windows.SDK.NET.dll függőségeit, amely csökkenti a kódtár vagy az alkalmazás kimeneti 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 az adattárban található C#/WinRT embedded dokumentációt.
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: Az Windows-futtatókörnyezet Components használatával nem csomagolt asztali alkalmazások engedélyezése, amely az Windows 10 1903-es és újabb verziójában érhető el. A natív C++ összetevőknek a Windows Desktop Compatible tulajdonságot True értékre kell állítaniuk a projekt tulajdonságainál vagy a .vcxproj fájlon keresztül, hogy a Microsoft.VCLibs.Desktop bináris fájlokat hivatkozhassák és továbbíthassák a felhasználó alkalmazások felé. Ellenkező esetben a VCRT Forwarders csomagra szükségük lesz az azt használó alkalmazásoknak, 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 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: "Windows metaadatok nincsenek megadva vagy nem észlelhetők."
A Windows metaadatokat 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 újabb verzióiban ez a tulajdonság alapértelmezés szerint
TargetPlatformVersion, amely aTargetFrameworktulajdonságban megadott Windows SDK-verzióból származik.CS0246-os hiba: Nem található a "Windows" típus- vagy névtérnév (hiányzik egy használt irányelv vagy szerelvényhivatkozás?)
A hiba elhárításához szerkessze a
<TargetFramework>tulajdonságot egy adott Windows verzió megcélzásához, például:<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>A A Windows-futtatókörnyezet API-k hívása dokumentációban talál további információt a
<TargetFramework>tulajdonság megadásáról.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 lásd a COM interop guide.
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ő a Windows Asztali Kompatibilis tulajdonságot True-re a projekt tulajdonságain vagy a
.vcxprojfájlon keresztül állította be.
- 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ő a Windows Asztali Kompatibilis tulajdonságot True-re a projekt tulajdonságain vagy a
.NET SDK verziószámozási hibái
A következő 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 vagy a Microsoft.Windows.SDK.NET különböző verziói között, amelyeket nem lehet feloldani. | Ez az összeállítási figyelmeztetés akkor fordul elő, ha olyan kódtárra hivatkozik, amely Windows SDK-típusokat tesz 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ó hiba akkor fordul elő, amikor egy könyvtárban elérhető Windows SDK-típusokra hivatkozik és azokat felhasználja. |
| System.IO.FileLoadException | Ez a futtatókörnyezeti hiba akkor fordulhat elő, ha meghív bizonyos API-kat olyan könyvtárban, amely nem biztosítja a Windows SDK típusokat. |
A hibák elhárításához frissítse a .NET SDK-t a legújabb verzióra. Ez biztosítja, hogy az alkalmazás által használt futtatókörnyezet é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ény verzióinak 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 lapján.
További erőforrások
Windows developer