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.
A Visual Studio segítségével egyszerűen létrehozhatja és üzembe helyezheti saját egyéni Windows-futtatókörnyezet-típusait egy C# vagy Visual Basic használatával írt Windows-futtatókörnyezeti (WRC) projektben, majd hivatkozhat erre a WRC-re egy C++ alkalmazásprojektből, és felhasználhatja ezeket az egyéni típusokat az adott alkalmazásból.
A Windows Futtatókörnyezet-típusok belsőleg bármilyen .NET-funkciót használhatnak, amely egy UWP-alkalmazásban engedélyezett.
Megjegyzés:
További információ: Windows futtatókörnyezeti összetevők C# és Visual Basic esetén, valamint .NET for UWP-alkalmazások áttekintése.
Külsőleg a típus tagjai csak a Windows futtatókörnyezeti típusok számára tehetnek közzé paramétereket, és visszaadhatják az értékeket. A megoldás létrehozásakor a 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 a Windows Futtatókörnyezet összetevő (WRC), amelyet a Visual Studio belefoglal az alkalmazásodba.
Megjegyzés:
A .NET automatikusan leképez néhány gyakran használt .NET-típust, például primitív adattípust és gyűjteménytípust a Windows Futtatókörnyezet megfelelőire. Ezek a .NET-típusok a Windows futtatókörnyezet-összetevők nyilvános felületén használhatók, és az összetevő felhasználói számára megfelelő Windows-futtatókörnyezet-típusokként jelennek meg. Nézd meg a(z) Windows futtatókörnyezeti összetevőket C# és Visual Basic.
Előfeltételek
- Windows 10
- Microsoft Visual Studio
Üres alkalmazás létrehozása
A Visual Studióban hozzon létre egy új projektet az Üres alkalmazás (C++/WinRT) projektsablon használatával. 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, hogy a mappaszerkezet megfeleljen az áttekintésnek.
C# Windows futtatókörnyezeti ö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 , és válassza a Hozzáadás, majd az Új projekt lehetőséget egy új C#-projekt megoldáshoz való hozzáadásához. Az Új projekt 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 a Windows Futtatókörnyezet-összetevő (Univerzális Windows) sablont, és adja meg a mintaösszetevőt a projekt nevéhez.
Megjegyzés:
Az Új univerzális Windows-platform projekt párbeszédpanelen válassza ki a Minimális verzióhoz a Windows 10 Készítők frissítése (10.0; build 15063). 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-ről Example-ra. 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}"; } }
Megjegyzés:
Alapértelmezés szerint az osztály nyilvános, lezárt megjelöléssel rendelkezik. Az összetevőből közzétett windowsos futtatókörnyezeti osztályoknak lezártkell lenniük.
Megjegyzés:
Nem kötelező: Ha engedélyezni szeretné az IntelliSense-t az újonnan hozzáadott tagok számára, nyissa meg a SampleComponent projekt helyi menüjét a Megoldáskezelőben, majd válassza a Build lehetőséget.
A CppToCSharpWinRT projekt C# SampleComponentjének hivatkozása
A Megoldáskezelőben a C++/WinRT projektben nyissa meg a Hivatkozások helyi menüjét, majd a Hivatkozás hozzáadása párbeszédpanel megnyitásához válassza a Hivatkozás hozzáadása lehetőséget. Válassza Projektek, majd a Megoldáslehetőséget. Jelölje be a SampleComponent projekt jelölőnégyzetét, és hivatkozás hozzáadásához kattintson az OK gombra.
Megjegyzés:
Nem kötelező: Ha engedélyezni szeretné az IntelliSense-t a C++/WinRT projekthez, nyissa meg a CppToCSharpWinRT projekt helyi menüjét a Megoldáskezelőben, 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 az #include utasítások végére, 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;
...
};
}
Megjegyzés:
A Visual Studióban a MainPage.h szerepel a MainPage.xaml alatt.
MainPage.cpp szerkesztése
A MainPage.cpp-ban módosítsa a Mainpage::ClickHandler implementációt úgy, hogy a C# metódust, GetMyString-t 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.
Jótanács
A Visual Studióban hozza létre az összetevőprojektet: A Megoldáskezelőben nyissa meg a CppToCSharpWinRT projekt helyi menüjét, és válassza a Tulajdonságok lehetőséget, majd a Konfiguráció tulajdonságai területen válassza a Hibakeresés lehetőséget. 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ó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 processzor támogatását.
Jótanács
Javasoljuk, hogy az 16299-nél kisebb alkalmazásminimum-verziókat használja az extra buildkonfiguráció elkerülése érdekében, ha nem szükséges .NET Standard 2.0 vagy Arm64 támogatás.
Konfigurálás a Windows 10 Fall Creators Update (10.0; 16299-s build)
Az alábbi lépéseket követve engedélyezheti a .NET Standard 2.0- vagy Windows Arm64-támogatást a C++/WinRT projektből hivatkozott C#-projektekben.
A Visual Studióban nyissa meg a Megoldáskezelőt, és nyissa meg a CppToCSharpWinRT projekt helyi menüjét. Válassza a Tulajdonságok lehetőséget, és állítsa be az Universal Windows App minimális verzióját a Windows 10 Fall Creators Update (10.0; Build 16299) (vagy újabb) verzióra. Tegye ugyanezt a SampleComponent projekt esetében is.
A Visual Studióban nyissa meg a CppToCSharpWinRT projekt helyi menüjét, és válassza a Projekt törlése lehetőséget a CppToCSharpWinRT.vcxproj szövegszerkesztőben való megnyitásához.
Másolja és illessze be a következő XML-t az első PropertyGroup-ba az CPPWinRTCSharpV2.vcxproj-ben.
<!-- 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 DotNetNativeVersion, DotNetNativeSharedLibrary, és UWPCoreRuntimeSdkVersion értékei a Visual Studio verziójától függően változhatnak. Ha a megfelelő értékekre szeretné állítani őket, nyissa meg a %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages, és tekintse meg az alkönyvtárat az alábbi táblázatban szereplő összes értékhez. A %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler címtárnak lesz egy alkönyvtára, amely tartalmazza a .NET natív verziójának 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 példa 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
Megjegyzés:
A Microsoft.Net.Native.SharedLibrary több támogatott architektúrát is kínál. Cserélje az x64-t a megfelelő architektúrára. Az architektúra például arm64 a %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-arm64.microsoft.net.native.sharedlibrary könyvtárban lenne.
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 projektfájl végén, a záró Project címke előtt adja hozzá a következőt (változatlanul).
<!-- 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 Studióban. Ehhez a Visual Studio Megoldáskezelőben nyissa meg a CppToCSharpWinRT projekt helyi menüjét, és válassza a Projekt újratöltéselehetőséget.
.NET Native-re fejlesztés
Javasoljuk, hogy az alkalmazást a .NET natív rendszerén alapuló C# összetevővel hozza létre és tesztelje. A Visual Studióban nyissa meg a CppToCSharpWinRT projekt helyi menüjét, és válassza a Projekt törlése lehetőséget a CppToCSharpWinRT.vcxproj szövegszerkesztőben való megnyitásához.
Ezután állítsa be a UseDotNetNativeToolchain tulajdonságot true a C++ projektfájl kiadási és Arm64-konfigurációiban.
A Visual Studio Solution Explorerben nyissa meg a CppToCSharpWinRT projekt helyi menüjét, és válassza a Projekt újratöltéselehető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.
Adja hozzá ugyanazt a nuget csomag hivatkozását a packages.config:
<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 futtatókörnyezeti összetevők C# és Visual Basic
- Windows Runtime-összetevők C++/WinRT használatával