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.
Ebben a témakörben bemutatjuk, hogyan használható a C#/WinRT egy C++/WinRT Windows-futtatókörnyezet összetevőből C# .NET vetületszerelvény (vagy interop szerelvény) generálására, és ennek .NET alkalmazások számára NuGet-csomagként való terjesztésére.
A .NET 6 és az azt követő verziókban a Windows metaadatfájlok (WinMD) használata már nem támogatott (lásd A WinRT beépített támogatása el lett távolítva a .NET-ből). Ehelyett a C#/WinRT eszköz bármely WinMD-fájlhoz létrehozhat egy kivetítési szerelvényt, amely lehetővé teszi a WinRT-összetevők használatát .NET alkalmazásokból. A vetületi szerelvényt interop szerelvénynek is nevezik. Ez az útmutató a következőket mutatja be:
- A C#/WinRT-csomag használatával C#-vetítést hozhat létre egy C++/WinRT-összetevőből.
- Ossza el az összetevőt és a vetítési szerelvényt NuGet-csomagként.
- Használja fel a NuGet-csomagot egy .NET konzolalkalmazásból.
Előfeltételek
Ehhez az útmutatóhoz és a megfelelő mintához a következő eszközökre és összetevőkre van szükség:
- Visual Studio 2022 vagy újabb telepített Univerzális Windows-platform fejlesztési munkaterheléssel. A Installation Details>Univerzális Windows-platform development lapon ellenőrizze a C++ (v14x) Univerzális Windows-platform eszközöket lehetőséget.
- .NET 8.0 SDK (LTS) vagy újabb.
Ebben az útmutatóban a Visual Studio 2022-.NET 8-at fogjuk használni.
Fontos
Emellett le kell töltenie vagy klónoznia kell a témakör mintakódját a C#/WinRT-vetítési mintából GitHub. Látogasson el a CsWinRT webhelyre, és kattintson a zöld Kód gombra az git clone URL-cím lekéréséhez. Mindenképpen olvassa el a mintához tartozó README.md fájlt.
Egyszerű C++/WinRT Windows-futtatókörnyezet összetevő létrehozása
Az útmutató követéséhez először rendelkeznie kell egy C++/WinRT Windows-futtatókörnyezet összetevővel (WRC), amelyből létre kell hoznia a C#-vetítési szerelvényt.
Ez az útmutató a SimpleMathComponent WRC-t használja a C#/WinRT-vetítési mintából a(z) GitHubon, amelyet már letöltött vagy klónozott. SimpleMathComponent a Windows-futtatókörnyezet Összetevő (C++/WinRT) Visual Studio projektsablonból jött létre.
A SimpleMathComponent projekt megnyitásához nyissa meg a Visual Studio \CsWinRT\src\Samples\NetProjectionSample\CppWinRTComponentProjectionSample.sln fájlt, amelyet az adattár letöltésében vagy klónozásában talál.
A projekt kódja az alábbi fejlécfájlban látható alapszintű matematikai műveletek funkcióit biztosítja.
// SimpleMath.h
...
namespace winrt::SimpleMathComponent::implementation
{
struct SimpleMath: SimpleMathT<SimpleMath>
{
SimpleMath() = default;
double add(double firstNumber, double secondNumber);
double subtract(double firstNumber, double secondNumber);
double multiply(double firstNumber, double secondNumber);
double divide(double firstNumber, double secondNumber);
};
}
Ellenőrizheti, hogy a Windows Asztali kompatibilis tulajdonság Igen értékre van-e állítva a SimpleMathComponent C++/WinRT Windows-futtatókörnyezet összetevőprojekthez. Ehhez a SimpleMathComponent project tulajdonságai között a Configuration Properties>General>Project Defaults, állítsa a Windows Asztali kompatibilis tulajdonságot Yes értékre. Ez biztosítja, hogy a megfelelő futtatókörnyezeti bináris fájlok betöltve legyenek .NET asztali alkalmazások felhasználásához.
A C++/WinRT-összetevők létrehozásának és a WinMD-fájlok létrehozásának részletes lépéseit a C++/WinRT
Megjegyzés:
Ha IInspectable::GetRuntimeClassName implementál az összetevőben, akkor érvényes WinRT-osztálynevet kell visszaadnia. Mivel a C#/WinRT az osztálynév sztringjét használja az interophoz, egy helytelen futtatókörnyezeti osztálynév egy InvalidCastExceptionkivételt fog eredményezni.
Vetítési projekt hozzáadása az összetevőmegoldáshoz
Először is, ha a CppWinRTComponentProjectionSample projekt továbbra is nyitva van a Visual Studio-ban, távolítsa el a SimpleMathProjection projektet a fejlesztési környezetből. Ezután törölje a fájlrendszerből a SimpleMathProjection mappát (vagy ha szeretné, nevezze át). Ezekre a lépésekre azért van szükség, hogy lépésről lépésre követni tudja ezt az útmutatót.
Adjon hozzá egy új C#-kódtárprojektet a megoldáshoz.
- A Megoldáskezelő-ben kattintson a jobb gombbal a megoldáscsomópontra, és kattintson a Add>New Project.
- A Új projekt hozzáadása párbeszédpanelen írja be Osztálykönyvtár a keresőmezőbe. Válassza C# lehetőséget a nyelvi listából, majd válassza Windows a platformlistából. Válassza ki az egyszerűen osztálytárnak nevezett C#-projektsablont (előtagok és utótagok nélkül), majd kattintson a Tovább gombra.
- Nevezze el az új simpleMathProjection projektet. A helyet már ugyanarra
\CsWinRT\src\Samples\NetProjectionSamplea mappára kell állítani, amelyben a SimpleMathComponent mappa található, de ezt erősítse meg. Ezután kattintson a Next gombra. - A Additional information lapon válassza a .NET 8.0 (Hosszú távú támogatás) lehetőséget, majd válassza a Create lehetőséget.
Törölje a csonk Class1.cs fájlt a projektből.
Az alábbi lépésekkel telepítheti a C#/WinRT NuGet-csomagot.
- A Megoldáskezelő kattintson a jobb gombbal a SimpleMathProjection projektre, és válassza a Manage NuGet Packages lehetőséget.
- A Browse lapon írja be vagy illessze be Microsoft.Windows. CsWinRT a keresőmezőbe, a keresési eredmények között válassza ki a legújabb verziójú elemet, majd kattintson a Install elemre a csomag SimpleMathProjection projektbe való telepítéséhez.
Adjon hozzá a SimpleMathProjectionhez egy projekthivatkozást a SimpleMathComponent projekthez. A Megoldáskezelő-ben kattintson a jobb gombbal a Dependencies csomópontra a SimpleMathProjection project csomópont alatt, válassza a Add Project Reference, majd a SimpleMathComponent project >OK lehetőséget.
Még ne próbálja meg felépíteni a projektet. Ezt egy későbbi lépésben fogjuk megtenni.
Az eddigi Megoldáskezelő ehhez hasonlónak kell lennie (a verziószámok eltérőek lesznek).
Készíts projekteket forrásból
A CppWinRTComponentProjectionSample megoldás esetében a C#/WinRT-vetítési mintában (amelyet GitHubról letöltöttél vagy klónoztál, és most meg van nyitva), a build kimeneti helye a Directory.Build.props fájlban van konfigurálva a forráson kívül történő létrehozásra. Ez azt jelenti, hogy a build kimenetéből származó fájlok a forrásmappán kívül jönnek létre. A C#/WinRT eszköz használatakor javasoljuk, hogy a forrásból építsen ki. Ez megakadályozza, hogy a C#-fordító véletlenül felvegyen minden *.cs fájlt a projekt gyökérkönyvtára alatt, ami ismétlődő típushibákat okozhat (például több konfiguráció és/vagy platform összeállítása esetén).
Annak ellenére, hogy ez már konfigurálva van a CppWinRTComponentProjectionSample megoldáshoz, kövesse az alábbi lépéseket, hogy gyakorolhassa a konfiguráció saját maga számára történő elvégzését.
A megoldás konfigurálása forrásból való buildelésre:
Ha a CppWinRTComponentProjectionSample megoldás továbbra is nyitva van, kattintson a jobb gombbal a megoldáscsomópontra, és válassza azÚj elem> lehetőséget. Válassza ki az XML-fájlelemet , és nevezze el Directory.Build.props néven (bővítmény nélkül
.xml). Kattintson az Igen gombra a meglévő fájl felülírásához.Cserélje le a Directory.Build.props tartalmát az alábbi konfigurációra.
<Project> <PropertyGroup> <BuildOutDir>$([MSBuild]::NormalizeDirectory('$(SolutionDir)', '_build', '$(Platform)', '$(Configuration)'))</BuildOutDir> <OutDir>$([MSBuild]::NormalizeDirectory('$(BuildOutDir)', '$(MSBuildProjectName)', 'bin'))</OutDir> <IntDir>$([MSBuild]::NormalizeDirectory('$(BuildOutDir)', '$(MSBuildProjectName)', 'obj'))</IntDir> </PropertyGroup> </Project>Mentse és zárja be a Directory.Build.props fájlt.
A projektfájl szerkesztése a C#/WinRT végrehajtásához
Mielőtt meghívhatja az eszközt a cswinrt.exe vetítési szerelvény létrehozásához, először szerkesztenie kell a projektfájlt néhány projekttulajdonság megadásához.
A Megoldáskezelő fájlban kattintson duplán a SimpleMathProjection csomópontra a projektfájl szerkesztőben való megnyitásához.
Frissítse a
TargetFrameworkelemet egy adott Windows SDK-verzió megcélzásához. Ez hozzáadja az interop és a projection támogatásához szükséges szerelvényfüggőségeket. Ez a minta a Windows SDK net6.0-windows10.0.19041.0 (más néven Windows 10, 2004-es verzió) verzióját célozza meg. Állítsa be aPlatformelemet a AnyCPU értékre, hogy az eredményül kapott vetítési összeszerelés bármely alkalmazásarchitektúrából elérhető legyen. Ha engedélyezni szeretné, hogy a hivatkozási alkalmazások támogatják a korábbi Windows SDK-verziókat, beállíthatja aTargetPlatformMinimumVersiontulajdonságot is.<PropertyGroup> <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework> <!-- Set Platform to AnyCPU to allow consumption of the projection assembly from any architecture. --> <Platform>AnyCPU</Platform> </PropertyGroup>Megjegyzés:
Ehhez az útmutatóhoz és a kapcsolódó mintakódhoz a megoldás x64 és Kiadványkészült. Vegye figyelembe, hogy a SimpleMathProjection projekt úgy van beállítva, hogy minden architektúra-konfiguráció esetén az AnyCPU platformra épüljön.
Adjon hozzá egy második
PropertyGroupelemet (közvetlenül az első után), amely több C#/WinRT-tulajdonságot állít be.<PropertyGroup> <CsWinRTIncludes>SimpleMathComponent</CsWinRTIncludes> <CsWinRTGeneratedFilesDir>$(OutDir)</CsWinRTGeneratedFilesDir> </PropertyGroup>A példában szereplő beállításokkal kapcsolatban az alábbiakban talál néhány részletet:
- A
CsWinRTIncludestulajdonság határozza meg, hogy mely névtereket kell kivetíteni. - A
CsWinRTGeneratedFilesDirtulajdonság beállítja azt a kimeneti könyvtárat, amelyben a vetítési forrásfájlok létre lettek hozva. Ez a tulajdonság a fenti szakaszban meghatározottOutDirértékre van állítva, a Directory.Build.props alapján.
- A
Mentse és zárja be a SimpleMathProjection.csproj fájlt, és szükség esetén kattintson a projektek újratöltéséhez .
NuGet-csomag létrehozása a kivetítéssel
Ha el szeretné osztani a kivetítési szerelvényt .NET alkalmazásfejlesztők számára, automatikusan létrehozhat egy NuGet-csomagot a megoldás létrehozásakor néhány további projekttulajdonság hozzáadásával. A .NET célok esetében a NuGet-csomagnak tartalmaznia kell a kivetítési szerelvényt és az összetevő implementációs szerelvényét.
Az alábbi lépésekkel nuGet-specifikációs (
.nuspec) fájlt adhat hozzá a SimpleMathProjection projekthez.- A Megoldáskezelő kattintson a jobb gombbal a SimpleMathProjection csomópontra, válassza a Add>Új mappa lehetőséget, és nevezze el a mappát nuget.
- Kattintson a jobb gombbal a nuget mappára, válassza azÚj elem> lehetőséget, válassza az XML-fájlt, és adja neki a SimpleMathProjection.nuspec nevet.
A Megoldáskezelő fájlban kattintson duplán a SimpleMathProjection csomópontra a projektfájl szerkesztőben való megnyitásához. Adja hozzá a következő tulajdonságcsoportot a most megnyitott SimpleMathProjection.csproj fájlhoz (közvetlenül a két meglévő
PropertyGroupelem után) a csomag automatikus létrehozásához. Ezek a tulajdonságok határozzák meg a NuGet-csomag létrehozásához aNuspecFileelemet és a könyvtárat.<PropertyGroup> <GeneratedNugetDir>.\nuget\</GeneratedNugetDir> <NuspecFile>$(GeneratedNugetDir)SimpleMathProjection.nuspec</NuspecFile> <OutputPath>$(GeneratedNugetDir)</OutputPath> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> </PropertyGroup>Megjegyzés:
Ha külön szeretne létrehozni egy csomagot, akkor a parancssorból is futtathatja az
nuget.exeeszközt. További információ egy NuGet-csomag létrehozásáról: Csomag létrehozása a nuget.exe parancssorihasználatával.Nyissa meg a SimpleMathProjection.nuspec fájlt a csomaglétrehozási tulajdonságok szerkesztéséhez, és illessze be a következő kódot. Az alábbi kódrészlet egy példa NuGet-specifikáció a SimpleMathComponent több cél keretrendszerre való terjesztéséhez. Vegye figyelembe, hogy a SimpleMathComponent.winmd helyett a SimpleMathProjection.dllvetítési szerelvény van megadva a cél
lib\net6.0-windows10.0.19041.0\SimpleMathProjection.dll. Ez a viselkedés a .NET 6-os és újabb verzióiban új, és a C#/WinRT engedélyezi. Az implementálási szerelvényt (SimpleMathComponent.dll) is el kell osztani, és futásidőben kell betölteni.<?xml version="1.0" encoding="utf-8"?> <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd"> <metadata> <id>SimpleMathComponent</id> <version>0.1.0-prerelease</version> <authors>Contoso Math Inc.</authors> <description>A simple component with basic math operations</description> <dependencies> <group targetFramework="net6.0-windows10.0.19041.0" /> <group targetFramework=".NETCoreApp3.0" /> <group targetFramework="UAP10.0" /> <group targetFramework=".NETFramework4.6" /> </dependencies> </metadata> <files> <!--Support .NET 6, .NET Core 3, UAP, .NET Framework 4.6, C++ --> <!--Architecture-neutral assemblies--> <file src="..\..\_build\AnyCPU\Release\SimpleMathProjection\bin\SimpleMathProjection.dll" target="lib\net6.0-windows10.0.19041.0\SimpleMathProjection.dll" /> <file src="..\..\_build\x64\Release\SimpleMathComponent\bin\SimpleMathComponent\SimpleMathComponent.winmd" target="lib\netcoreapp3.0\SimpleMathComponent.winmd" /> <file src="..\..\_build\x64\Release\SimpleMathComponent\bin\SimpleMathComponent\SimpleMathComponent.winmd" target="lib\uap10.0\SimpleMathComponent.winmd" /> <file src="..\..\_build\x64\Release\SimpleMathComponent\bin\SimpleMathComponent\SimpleMathComponent.winmd" target="lib\net46\SimpleMathComponent.winmd" /> <!--Architecture-specific implementation DLLs should be copied into RID-relative folders--> <file src="..\..\_build\x64\Release\SimpleMathComponent\bin\SimpleMathComponent\SimpleMathComponent.dll" target="runtimes\win10-x64\native\SimpleMathComponent.dll" /> <!--To support x86 and Arm64, build SimpleMathComponent for those other architectures and uncomment the entries below.--> <!--<file src="..\..\_build\Win32\Release\SimpleMathComponent\bin\SimpleMathComponent\SimpleMathComponent.dll" target="runtimes\win10-x86\native\SimpleMathComponent.dll" />--> <!--<file src="..\..\_build\arm64\Release\SimpleMathComponent\bin\SimpleMathComponent\SimpleMathComponent.dll" target="runtimes\win10-arm64\native\SimpleMathComponent.dll" />--> </files> </package>Megjegyzés:
SimpleMathComponent.dllaz összetevő implementálási szerelvénye architektúraspecifikus. Ha más platformokat (például x86-ot vagy Arm64-et) támogat, először a SimpleMathComponentet fel kell építenie a kívánt platformokhoz, és hozzá kell adnia ezeket az assembly fájlokat a megfelelő RID-specifikus mappához. A kivetítési szerelvény SimpleMathProjection.dll és a SimpleMathComponent.winmd összetevő egyaránt architektúrasemleges.
Mentse és zárja be az imént szerkesztett fájlokat.
A megoldás létrehozása a kivetítés és a NuGet-csomag létrehozásához
A megoldás létrehozása előtt ellenőrizze a Konfigurációkezelő beállításait a Visual Studio Build>Konfigurációkezelő alatt. Ebben a lépésről-lépésre útmutatóban állítsa be a Konfiguráció-t a Kiadás-ra és a Platform-t a x64-re a megoldáshoz.
Ezen a ponton már létrehozhatja a megoldást. Kattintson a jobb gombbal a megoldás csomópontra, és válassza a Build megoldáslehetőséget. Ez először a SimpleMathComponent projektet, majd a SimpleMathProjection projektet hozza létre. A WinMD összetevő és az implementáció szerelvénye (SimpleMathComponent.winmd és SimpleMathComponent.dll), a kivetítési forrásfájlok és a kivetítési szerelvény (SimpleMathProjection.dll) mind a _build kimeneti könyvtárban lesznek létrehozva. A létrehozott NuGet-csomagot is láthatja, a SimpleMathComponent0.1.0-prerelease.nupkg fájlt a \SimpleMathProjection\nuget mappa alatt.
Fontos
Ha a fent említett fájlok egyike sem jön létre, akkor hozza létre a megoldást még egyszer. Előfordulhat, hogy be kell zárnia és újra meg kell nyitnia a megoldást, mielőtt újraépíti.
Előfordulhat, hogy be kell zárnia és újra meg kell nyitnia a megoldást, hogy a .nupkg megjelenjen a Visual Studio-ban az ábrán látható módon (vagy egyszerűen válassza a Show All Files lehetőséget, majd törölje a kijelölést).
Hivatkozás a NuGet-csomagra egy C# .NET 6-os konzolalkalmazásban
A SimpleMathComponent .NET projektből való felhasználásához egyszerűen hozzáadhat egy új .NET projekthez egy hivatkozást az előző szakaszban létrehozott SimpleMathComponent0.1.0-prerelease.nupkg NuGet-csomagra. Az alábbi lépések bemutatják, hogyan teheti ezt meg egy egyszerű konzolalkalmazás külön megoldásban való létrehozásával.
Az alábbi lépésekkel létrehozhat egy C# -konzolalkalmazás-projektet tartalmazó új megoldást (a projekt új megoldásban való létrehozása lehetővé teszi a SimpleMathComponent NuGet-csomag önálló visszaállítását).
Fontos
Ebben a mappában fogjuk létrehozni ezt az új
\CsWinRT\src\Samples\NetProjectionSample, amelyet a C#/WinRT-vetítési minta letöltött vagy klónozott verziójában talál.- A Visual Studio új példányában válassza a File>New>Project lehetőséget.
- Az Új projekt létrehozása párbeszédpanelen keresse meg a Konzolalkalmazás projektsablont. Válassza ki a egyszerűen konzolalkalmazásnak nevezett C#-projektsablont (előtagok és utótagok nélkül), majd kattintson a Tovább gombra. Ha 2019 Visual Studio használ, akkor a projektsablon Konzolalkalmazás.
- Nevezze el az új projektet SampleConsoleApp néven, állítsa a helyét arra
\CsWinRT\src\Samples\NetProjectionSamplea mappára, amelyben a SimpleMathComponent és a SimpleMathProjection mappa található, majd kattintson a Tovább gombra. - A Additional information lapon válassza a .NET 8.0 (Hosszú távú támogatás) lehetőséget, majd válassza a Create lehetőséget.
Megoldáskezelő Kattintson duplán a SampleConsoleApp csomópontra a SampleConsoleApp.csproj projektfájl megnyitásához, és szerkessze a
TargetFrameworkésPlatformtulajdonságokat úgy, hogy azok az alábbi felsorolásban látható módon jelenjenek meg. Adja hozzá azPlatformelemet, ha nincs ott.<PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework> <Platform>x64</Platform> </PropertyGroup>Ha a SampleConsoleApp.csproj projektfájl továbbra is nyitva van, a SampleConsoleApp projekthez hozzáadunk egy hivatkozást a SimpleMathComponent NuGet-csomaghoz. A SimpleMathComponent NuGet visszaállításához a projekt építésekor használhatja a
RestoreSourcestulajdonságot a komponens megoldás nuget mappájának elérési útjával. Másolja ki a következő konfigurációt, és illessze be a SampleConsoleApp.csproj (aProjectelembe).<PropertyGroup> <RestoreSources> https://api.nuget.org/v3/index.json; ../SimpleMathProjection/nuget </RestoreSources> </PropertyGroup> <ItemGroup> <PackageReference Include="SimpleMathComponent" Version="0.1.0-prerelease" /> </ItemGroup>Fontos
A fent látható
RestoreSourcescsomag elérési útja../SimpleMathProjection/nuget. Ez az elérési út helyes, feltéve, hogy követte az útmutató lépéseit, így a SimpleMathComponent és a SampleConsoleApp-projektek is ugyanabban a mappában vannak (ebben az esetben aNetProjectionSamplemappában). Ha valami mást tett, ennek megfelelően módosítania kell ezt az útvonalat. Másik lehetőségként hozzáadhat egy helyi NuGet csomagforrást a megoldáshoz.Szerkessze a Program.cs fájlt a SimpleMathComponent által biztosított funkciók használatához.
var x = new SimpleMathComponent.SimpleMath(); Console.WriteLine("Adding 5.5 + 6.5 ..."); Console.WriteLine(x.add(5.5, 6.5).ToString());Mentse és zárja be az imént szerkesztett fájlokat, majd hozza létre és futtassa a konzolalkalmazást. Az alábbi kimenetnek kell megjelennie.
Ismert problémák
- A vetítési projekt létrehozásakor a következő hibaüzenet jelenhet meg: Error MSB3271 A létrehozott projekt processzorarchitektúrája, "MSIL", és az implementációs fájl "..\SimpleMathComponent.dll" processzorarchitektúrája, "x86", között eltérés van "..\SimpleMathComponent.winmd". Ez az eltérés futásidejű hibákat okozhat. Kérjük, fontolja meg a projekt célzott processzorarchitektúrájának módosítását a Konfigurációkezelő segítségével, hogy a processzorarchitektúrák a projekt és az implementációs fájl között illeszkedjenek, vagy válasszon olyan winmd fájlt, amely implementációs fájlja a projekt célprocesszorarchitektúrájával megegyező processzorarchitektúrával rendelkezik. A hiba elkerüléséhez adja hozzá a következő tulajdonságot a C# könyvtár projektfájljához:
<PropertyGroup> <!-- Workaround for MSB3271 error on processor architecture mismatch --> <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch> </PropertyGroup>
További szempontok
A jelen témakörben bemutatott C#-vetítési (vagy interop) szerelvény meglehetősen egyszerű– nem függ más összetevőkhöz. Ha azonban olyan C#-vetítést szeretne létrehozni egy C++/WinRT-összetevőhöz, amely Windows App SDK típusra hivatkozik, a kivetítési projektben fel kell vennie egy hivatkozást a Windows App SDK NuGet-csomagra. Ha az ilyen hivatkozások hiányoznak, akkor olyan hibák jelennek meg, mint a "T< típus >nem található".
Egy másik dolog, amit ebben a témakörben teszünk, az a kivetítés NuGet-csomagként való terjesztése. Jelenleg szükséges.
Erőforrások
Windows developer