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.
Ez a témakör végigvezeti egy egyszerű C#-összetevő C++/WinRT-projekthez való hozzáadásának folyamatán.
Visual Studio megkönnyíti saját egyéni Windows-futtatókörnyezet-típusok készítését és üzembe helyezését egy C# vagy Visual Basic írt Windows-futtatókörnyezet-összetevő (WRC) projektben, majd hivatkozhat erre a WRC-re egy C++ alkalmazásprojektből, és felhasználhatja az adott alkalmazásból származó egyéni típusokat.
Belsőleg a Windows-futtatókörnyezet-típusok bármilyen .NET funkciót használhatnak, amely egy UWP-alkalmazásban engedélyezett.
Note
További információt itt talál: Windows-futtatókörnyezet-összetevők C#-hoz és Visual Basichez, valamint .NET UWP-alkalmazásokhoz – áttekintés.
Külsőleg a típus tagjai csak Windows-futtatókörnyezet típusokat tehetnek közzé a paramétereikhez, és visszaadhatják az értékeket. A megoldás létrehozásakor Visual Studio létrehozza a .NET WRC-projektet, majd végrehajt egy buildelési lépést, amely létrehoz egy Windows metaadatfájlt (.winmd). Ez az Ön Windows-futtatókörnyezet-összetevője (WRC), amelyet a Visual Studio foglal bele az alkalmazásába.
Note
.NET automatikusan leképez néhány gyakran használt .NET típust, például a primitív adattípusokat és a gyűjteménytípusokat a Windows-futtatókörnyezet megfelelőikre. Ezek a .NET típusok használhatók egy Windows-futtatókörnyezet összetevő nyilvános felületén, és az összetevő felhasználói számára a megfelelő Windows-futtatókörnyezet típusokként jelennek meg. Tekintse meg Windows-futtatókörnyezet C# és Visual Basic összetevőket.
Prerequisites
- Windows 10
- Microsoft Visual Studio
Üres alkalmazás létrehozása
Az Visual Studio hozzon létre egy új projektet az Üres alkalmazás (C++/WinRT) projektsablon használatával (WinUI 3 asztali alkalmazások esetén használja az Üres alkalmazás, Csomagolt (WinUI 3 in Desktop) sablont). Győződjön meg arról, hogy a (C++/WinRT) sablont használja, és nem az (univerzális Windows) sablont.
Állítsa be az új projekt nevét CppToCSharpWinRT értékre, hogy a mappaszerkezet megfeleljen az útmutatónak.
C# Windows-futtatókörnyezet összetevő hozzáadása a megoldáshoz
A Visual Studióban hozza létre az összetevőprojektet: A Megoldáskezelőben nyissa meg a CppToCSharpWinRT megoldás helyi menüjét, válassza a Hozzáadás, majd az Új projekt lehetőséget, ha új C#-projektet szeretne a megoldáshoz adni. Az Új Project hozzáadása párbeszédpanel Telepített sablonok szakaszában válassza a Visual C#, majd a Windows, majd az Univerzális lehetőséget. Válassza ki az Windows-futtatókörnyezet Összetevő (Univerzális Windows) sablont, és adja meg a Mintakomponens nevet a projekt nevéhez.
Note
Az Új Univerzális Windows-platform projekt párbeszédpanelen válassza a Windows 10 Creators Update (10.0; Build 15063) lehetőséget minimális verzióként. További információért tekintse meg az alkalmazás minimális verziója című szakaszt.
A C# GetMyString metódus hozzáadása
A SampleComponent projektben módosítsa az osztály nevét Class1 névről Example névre. Ezután adjon hozzá két egyszerű tagot az osztályhoz, egy privát int mezőt és egy GetMyString nevű példánymetódust:
public sealed class Example { int MyNumber; public string GetMyString() { return $"This is call #: {++MyNumber}"; } }
Note
Alapértelmezés szerint az osztály nyilvánosan lezártként van megjelölve. A komponensből közzétett összes Windows-futtatókörnyezet osztálynak lezártnak kell lennie.
Note
Nem kötelező: Ha engedélyezni szeretné az IntelliSense-t az újonnan hozzáadott tagok számára, a Megoldáskezelő nyissa meg a SampleComponent projekt helyi menüjét, majd válassza a Build lehetőséget.
A CppToCSharpWinRT projekt C# SampleComponentjének hivatkozása
A Megoldáskezelő C++/WinRT projektben nyissa meg a Hivatkozások helyi menüjét, majd a Hivatkozás hozzáadásapárbeszédpanel megnyitásához válassza a Hivatkozás hozzáadása párbeszédpanelt. Válassza a Projektek, majd a Megoldás lehetőséget. Jelölje be a SampleComponent projekt jelölőnégyzetét, és hivatkozás hozzáadásához kattintson az OK gombra.
Note
Nem kötelező: Ha engedélyezni szeretné az IntelliSense-t a C++/WinRT projekthez, nyissa meg a CppToCSharpWinRT projekt helyi menüjét Megoldáskezelő, majd válassza a Build lehetőséget.
MainPage.h szerkesztése
Nyissa meg MainPage.h a CppToCSharpWinRT projektben, majd vegyen fel két elemet. Először adja hozzá a #include "winrt/SampleComponent.h" elemet a #include utasítások végéhez, majd egy winrt::SampleComponent::Example mezőt a MainPage struktúrához.
// MainPage.h
...
#include "winrt/SampleComponent.h"
namespace winrt::CppToCSharpWinRT::implementation
{
struct MainPage : MainPageT<MainPage>
{
...
winrt::SampleComponent::Example myExample;
...
};
}
Note
A Visual Studióban a(z) MainPage.h a(z) MainPage.xaml alatt található.
MainPage.cpp szerkesztése
A(z) MainPage.cpp elemben módosítsa az Mainpage::ClickHandler implementációt úgy, hogy a(z) GetMyString C#-metódust hívja meg.
void MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
//myButton().Content(box_value(L"Clicked"));
hstring myString = myExample.GetMyString();
myButton().Content(box_value(myString));
}
A projekt futtatása
Most már létrehozhatja és futtathatja a projektet. Minden alkalommal, amikor a gombra kattint, a gombban lévő szám növekszik.
Tipp
A Visual Studio hozza létre az összetevőprojektet: A Megoldáskezelő nyissa meg a CppToCSharpWinRT projekt helyi menüjét, és válassza a Tulajdonságok lehetőséget, majd válassza a Hibakeresés lehetőséget a Konfiguráció tulajdonságai területen. Ha a C# (felügyelt) és a C++ (natív) kódot is szeretné hibakeresésre használni, állítsa a hibakereső típusát felügyelt és natív értékre.
Alkalmazás minimális verziója
A C# projektverzió Alkalmazásminimum értéke szabályozza az alkalmazás fordításához használt .NET verzióját. Például a Windows 10 Fall Creators Update (10.0; build 16299) vagy újabb verzió kiválasztása lehetővé teszi a .NET Standard 2.0 és a Windows Arm64 processzorok támogatását.
Tipp
Javasoljuk, hogy az 16299-nél kisebb alkalmazásminimum-verziókat használja az extra buildkonfiguráció elkerülése érdekében, ha .NET Standard 2.0- vagy Arm64-támogatás nem szükséges.
Konfigurálás a Windows 10 Fall Creators Update rendszerhez (10.0; 16299-es build)
Az alábbi lépéseket követve engedélyezheti .NET Standard 2.0-s vagy Windows Arm64-támogatást a C++/WinRT projektből hivatkozott C#-projektekben.
A Visual Studióban lépjen a Megoldáskezelőre, majd nyissa meg a CppToCSharpWinRT projekt helyi menüjét. Válassza a Tulajdonságok lehetőséget, és állítsa az Univerzális Windows-alkalmazás Minimális verziót Windows 10 Fall Creators Update (10.0; Build 16299) (vagy újabb). Tegye ugyanezt a SampleComponent projekt esetében is.
A Visual Studióban nyissa meg a CppToCSharpWinRT projekt helyi menüjét, majd a CppToCSharpWinRT.vcxproj szövegszerkesztőben való megnyitásához válassza a Projekt eltávolítása lehetőséget.
Másolja és illessze be a következő XML-t az első PropertyGroup elembe itt: CPPWinRTCSharpV2.vcxproj.
<!-- Start Custom .NET Native properties -->
<DotNetNativeVersion>2.2.12-rel-31116-00</DotNetNativeVersion>
<DotNetNativeSharedLibrary>2.2.8-rel-31116-00</DotNetNativeSharedLibrary>
<UWPCoreRuntimeSdkVersion>2.2.14</UWPCoreRuntimeSdkVersion>
<!--<NugetPath>$(USERPROFILE)\.nuget\packages</NugetPath>-->
<NugetPath>$(ProgramFiles)\Microsoft SDKs\UWPNuGetPackages</NugetPath>
<!-- End Custom .NET Native properties -->
A(z) DotNetNativeVersion, DotNetNativeSharedLibrary és UWPCoreRuntimeSdkVersion értékei a Visual Studio verziójától függően eltérhetnek. Ha a megfelelő értékekre szeretné állítani őket, nyissa meg az %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages alkönyvtárat, és tekintse meg az alábbi táblázatban szereplő összes érték alkönyvtárát. A %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler címtárnak lesz egy alkönyvtára, amely tartalmazza a natív .NET telepített verzióját, amely a következővel 2.2kezdődik: . Az alábbi példában ez: 2.2.12-rel-31116-00.
MSBuild változó Címtár Example DotNetNativeVersion %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler2.2.12-rel-31116-00DotNetNativeSharedLibrary %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-x64.microsoft.net.native.sharedlibrary2.2.8-rel-31116-00UWPCoreRuntimeSdkVersion %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.UWPCoreRuntimeSdk2.2.14
Note
A Microsoft.Net.Native.SharedLibrary számára több támogatott architektúra is létezik. Cserélje le x64 a megfelelő architektúrára. Például a arm64 architektúra a %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-arm64.microsoft.net.native.sharedlibrary könyvtárban található.
Ezután közvetlenül az első PropertyGroupután adja hozzá a következőt (változatlanul).
<!-- Start Custom .NET Native targets -->
<!-- Import all of the .NET Native / CoreCLR props at the beginning of the project -->
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x86.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x64.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm64.Microsoft.Net.Native.Compiler.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary.props" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary.props" />
<!-- End Custom .NET Native targets -->
A project fájl végén, a záró Project címke előtt adja hozzá a következőt (változatlan).
<!-- Import all of the .NET Native / CoreCLR targets at the end of the project -->
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x86.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-x64.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk\$(UWPCoreRuntimeSdkVersion)\build\runtime.win10-arm.Microsoft.Net.UWPCoreRuntimeSdk.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x86.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-x64.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.Compiler\$(DotNetNativeVersion)\build\runtime.win10-arm64.Microsoft.Net.Native.Compiler.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x86.Microsoft.Net.Native.SharedLibrary.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-x64.Microsoft.Net.Native.SharedLibrary.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm.Microsoft.Net.Native.SharedLibrary.targets" />
<Import Condition="'$(WindowsTargetPlatformMinVersion)' >= '10.0.16299.0'" Project="$(NugetPath)\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary\$(DotNetNativeSharedLibrary)\build\runtime.win10-arm64.Microsoft.Net.Native.SharedLibrary.targets" />
<!-- End Custom .NET Native targets -->
Töltse be újra a projektfájlt a Visual Studio. Ehhez nyissa meg a CppToCSharpWinRT project helyi menüjét a Visual Studio Megoldáskezelő, és válassza az Újratöltés Project lehetőséget.
Natív .NET létrehozása
Javasoljuk, hogy az alkalmazást a natív .NET beépített C#-összetevővel hozza létre és tesztelje. A Visual Studióban nyissa meg a CppToCSharpWinRT projekt helyi menüjét, majd a Unload Project parancsot választva nyissa meg a(z) CppToCSharpWinRT.vcxproj elemet a szövegszerkesztőben.
Ezután állítsa be a UseDotNetNativeToolchain tulajdonságot true a C++ projektfájl kiadási és Arm64-konfigurációiban.
A Visual Studio Megoldáskezelőben nyissa meg a CppToCSharpWinRT projekt helyi menüjét, majd válassza a Projekt újratöltése lehetőséget.
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
...
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='Arm64'" Label="Configuration">
<UseDotNetNativeToolchain Condition="'$(UseDotNetNativeToolchain)'==''">true</UseDotNetNativeToolchain>
</PropertyGroup>
Hivatkozás más C# nuget-csomagokra
Ha a C# összetevő más nuget-csomagokra hivatkozik, előfordulhat, hogy az alkalmazás projektfájljának üzembehelyezési tartalomként listáznia kell a nuget-csomag fájlfüggőségeit. Ha például a C# összetevő a Newtonsoft.Json nuget-csomagra hivatkozik, az alkalmazásprojektben is ugyanarra a nuget-csomagra és fájlfüggőségre kell hivatkoznia.
A SampleComponent.csproj fájlban adja hozzá a nuget-csomag hivatkozását:
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.1</Version>
</PackageReference>
A CppToCSharpWinRT projektben keresse meg a packages.config fájlt, és adja hozzá a megfelelő nuget-hivatkozást. Ezzel telepíti a nuget-csomagot a megoldás csomagmappájába.
A packages.configadja hozzá ugyanazt a nuget-csomaghivatkozást:
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="native" developmentDependency="true" />
Ezután adja hozzá az alábbiakat az alkalmazásprojektfájlhoz, hogy hivatkozzon a megoldás csomagmappájában található megfelelő fájlfüggőségre. Például CppToCSharpWinRT.vcxproj adja hozzá a következőket:
<ItemGroup>
<None Include="..\packages\Newtonsoft.Json.13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll">
<Link>%(Filename)%(Extension)</Link>
<DeploymentContent>true</DeploymentContent>
</None>
</ItemGroup>
Kapcsolódó témakörök
Windows developer