Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp wordt u begeleid bij het toevoegen van een eenvoudig C#-onderdeel aan uw C++/WinRT-project.
Visual Studio maakt het eenvoudig om uw eigen aangepaste Windows Runtime-typen te maken en te implementeren in een WRC-project (Windows Runtime-onderdeel) dat is geschreven met C# of Visual Basic, en vervolgens om te verwijzen naar WRC vanuit een C++-toepassingsproject en om deze aangepaste typen van die toepassing te gebruiken.
Intern kunnen uw Windows Runtime-typen elke .NET-functionaliteit gebruiken die is toegestaan in een UWP-toepassing.
Opmerking
Zie voor meer informatie Windows Runtime-onderdelen met C# en Visual Basic en het overzicht van .NET voor UWP-apps.
Extern kunnen de leden van uw type alleen Windows Runtime-typen beschikbaar maken voor hun parameters en retourwaarden. Wanneer u uw oplossing bouwt, bouwt Visual Studio uw .NET WRC-project en voert u vervolgens een buildstap uit waarmee een Windows-metagegevensbestand (.winmd) wordt gemaakt. Dit is uw Windows Runtime-onderdeel (WRC), dat Visual Studio in uw app bevat.
Opmerking
.NET wijst automatisch enkele veelgebruikte .NET-typen, zoals primitieve gegevenstypen en verzamelingstypen, toe aan hun Windows Runtime-equivalenten. Deze .NET-typen kunnen worden gebruikt in de openbare interface van een Windows Runtime-onderdeel en worden weergegeven voor gebruikers van het onderdeel als de bijbehorende Windows Runtime-typen. Zie Windows Runtime-onderdelen met C# en Visual Basic.
Vereiste voorwaarden
- Windows 10
- Microsoft Visual Studio
Een lege app maken
Maak in Visual Studio een nieuw project met behulp van de Lege app (C++/WinRT) projectsjabloon. Zorg ervoor dat u de (C++/WinRT) sjabloon gebruikt en niet de (Universal Windows).
Stel de naam van het nieuwe project in op CppToCSharpWinRT zodat de mapstructuur overeenkomt met de stapsgewijze handleiding.
Een C# Windows Runtime-onderdeel toevoegen aan de oplossing
Maak in Visual Studio het onderdeelproject: Open in Solution Explorer het snelmenu voor de CppToCSharpWinRT-oplossing en kies Toevoegenen kies vervolgens Nieuw project om een nieuw C#-project toe te voegen aan de oplossing. Kies in de sectie Geïnstalleerde sjablonen van het dialoogvenster Nieuw project toevoegenVisual C#en kies vervolgens Windowsen Universele. Kies de Windows Runtime Component (Universal Windows) template en voer SampleComponent in als projectnaam.
Opmerking
Kies in het dialoogvenster New Universal Windows Platform ProjectWindows 10 Creators Update (10.0; Build 15063) als minimale versie. Zie de sectie Application Minimum Version hieronder voor meer informatie.
De methode C# GetMyString toevoegen
Wijzig in het project SampleComponent de naam van de klasse van Class1- in Voorbeeld. Voeg vervolgens twee eenvoudige leden toe aan de klasse, een privé-int veld en een instantiemethode met de naam GetMyString:
public sealed class Example { int MyNumber; public string GetMyString() { return $"This is call #: {++MyNumber}"; } }
Opmerking
De klasse wordt standaard gemarkeerd als openbare verzegelde. Alle Windows Runtime-klassen die u beschikbaar maakt vanuit uw onderdeel, moeten zijn verzegelde.
Opmerking
Optioneel: Als u IntelliSense wilt inschakelen voor de nieuw toegevoegde leden, opent u in Solution Explorer het snelmenu voor het project SampleComponent en kiest u vervolgens Build.
Verwijs naar C# SampleComponent vanuit het CppToCSharpWinRT-project
Open in Solution Explorer in het C++/WinRT-project het snelmenu voor Verwijzingenen kies vervolgens Verwijzing toevoegen om het dialoogvenster Verwijzing toevoegen te openen. Kies Projectenen kies vervolgens Solution. Schakel het selectievakje voor het project SampleComponent in en kies OK- om een verwijzing toe te voegen.
Opmerking
Optioneel: Als u IntelliSense wilt inschakelen voor het C++/WinRT-project, opent u in Solution Explorer het snelmenu voor het CppToCSharpWinRT-project en kiest u vervolgens Build.
MainPage.h bewerken
Open MainPage.h in het CppToCSharpWinRT project en voeg vervolgens twee items toe. Voeg eerst #include "winrt/SampleComponent.h" toe aan het einde van de #include-instructies en voeg vervolgens een winrt::SampleComponent::Example veld toe aan de MainPage struct.
// MainPage.h
...
#include "winrt/SampleComponent.h"
namespace winrt::CppToCSharpWinRT::implementation
{
struct MainPage : MainPageT<MainPage>
{
...
winrt::SampleComponent::Example myExample;
...
};
}
Opmerking
In Visual Studio wordt MainPage.h weergegeven onder MainPage.xaml.
MainPage.cpp bewerken
Wijzig in MainPage.cppde Mainpage::ClickHandler-implementatie om de C#-methode GetMyStringaan te roepen.
void MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
//myButton().Content(box_value(L"Clicked"));
hstring myString = myExample.GetMyString();
myButton().Content(box_value(myString));
}
Het project uitvoeren
U kunt nu het project bouwen en uitvoeren. Telkens wanneer u op de knop klikt, wordt het nummer in de knop verhoogd.
Aanbeveling
Maak in Visual Studio het onderdeelproject: Open in Solution Explorer het snelmenu voor het project CppToCSharpWinRT project en kies Eigenschappenen kies vervolgens Foutopsporing onder Configuratie-eigenschappen. Stel het foutopsporingsprogrammatype in op Beheerde en systeemeigen als u fouten wilt opsporen in zowel de C#-code (beheerd) als C++ (systeemeigen).
Minimale applicatieversie
De Application Minimum van de C#-projectversie bepaalt de versie van .NET die wordt gebruikt om de toepassing te compileren. Kies bijvoorbeeld Windows 10 Fall Creators Update (10.0; Build 16299) of hoger maakt ondersteuning voor .NET Standard 2.0 en Windows Arm64-processor mogelijk.
Aanbeveling
U wordt aangeraden Application Minimum-versies lager dan 16299 te gebruiken om extra buildconfiguratie te voorkomen als .NET Standard 2.0- of Arm64-ondersteuning niet nodig is.
Configureren voor Windows 10 Fall Creators Update (10.0; Build 16299)
Volg deze stappen om ondersteuning voor .NET Standard 2.0 of Windows Arm64 in te schakelen in de C#-projecten waarnaar wordt verwezen vanuit uw C++/WinRT-project.
Ga in Visual Studio naar Solution Explorer en open het snelmenu voor het CppToCSharpWinRT project. Kies Eigenschappen en stel de universele Windows App Min-versie in op Windows 10 Fall Creators Update (10.0; Build 16299) (of hoger). Doe hetzelfde voor het SampleComponent project.
Open in Visual Studio het snelmenu voor het CppToCSharpWinRT project en kies Project- verwijderen om CppToCSharpWinRT.vcxproj te openen in de teksteditor.
Kopieer en plak de volgende XML in de eerste PropertyGroup in 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 -->
De waarden voor DotNetNativeVersion, DotNetNativeSharedLibraryen UWPCoreRuntimeSdkVersion kunnen variëren, afhankelijk van de versie van Visual Studio. Als u ze wilt instellen op de juiste waarden, opent u de %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages en bekijkt u de submap voor elke waarde in de onderstaande tabel. De %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler map heeft een submap die een geïnstalleerde versie van .NET native bevat die begint met 2.2. In het onderstaande voorbeeld is het 2.2.12-rel-31116-00.
MSBuild-variabele Adreslijst Voorbeeld 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
Opmerking
Er zijn meerdere ondersteunde architecturen voor Microsoft.Net.Native.SharedLibrary. Vervang x64 door de juiste architectuur. De arm64-architectuur bevindt zich bijvoorbeeld in de map %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-arm64.microsoft.net.native.sharedlibrary.
Voeg vervolgens direct na de eerste PropertyGrouphet volgende toe (ongewijzigd).
<!-- 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 -->
Voeg aan het einde van het projectbestand, net vóór de afsluitende Project tag, het volgende toe (ongewijzigd).
<!-- 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 -->
Laad het projectbestand opnieuw in Visual Studio. Hiervoor opent u in Visual Studio Solution Explorer het snelmenu voor het CppToCSharpWinRT-project en kiest u Project opnieuw laden.
Bouwen voor .NET Native
Het wordt aanbevolen om uw toepassing te bouwen en te testen met het C#-onderdeel dat is gebouwd op basis van .NET native. Open in Visual Studio het snelmenu voor het CppToCSharpWinRT project en kies Project- verwijderen om CppToCSharpWinRT.vcxproj te openen in de teksteditor.
Stel vervolgens de eigenschap UseDotNetNativeToolchain in op true in de release- en Arm64-configuraties in het C++-projectbestand.
Open in Visual Studio Solution Explorer het snelmenu voor het CppToCSharpWinRT project en kies Project-opnieuw laden.
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
...
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='Arm64'" Label="Configuration">
<UseDotNetNativeToolchain Condition="'$(UseDotNetNativeToolchain)'==''">true</UseDotNetNativeToolchain>
</PropertyGroup>
Verwijzen naar andere C#-nuget-pakketten
Als het C#-onderdeel verwijst naar andere nuget-pakketten, heeft het projectbestand van de toepassing mogelijk lijstbestandsafhankelijkheden van het nuget-pakket nodig als implementatie-inhoud. Als het C#-onderdeel bijvoorbeeld verwijst naar het NuGet-pakket Newtonsoft.Json, moet ook naar hetzelfde nuget-pakket en dezelfde bestandsafhankelijkheid worden verwezen in het toepassingsproject.
Voeg in het bestand SampleComponent.csproj de nuget-pakketreferentie toe:
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.1</Version>
</PackageReference>
Zoek in het project CppToCSharpWinRT het packages.config bestand en voeg de juiste nuget-verwijzing toe. Hiermee wordt het nuget-pakket geïnstalleerd in de pakketmap van de oplossing.
Voeg in packages.configdezelfde nuget-pakketreferentie toe:
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="native" developmentDependency="true" />
Voeg vervolgens het volgende toe aan het toepassingsprojectbestand om te verwijzen naar de juiste bestandsafhankelijkheid uit de pakketmap van de oplossing. Voeg bijvoorbeeld in CppToCSharpWinRT.vcxproj het volgende toe:
<ItemGroup>
<None Include="..\packages\Newtonsoft.Json.13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll">
<Link>%(Filename)%(Extension)</Link>
<DeploymentContent>true</DeploymentContent>
</None>
</ItemGroup>