Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieses Thema führt Sie durch den Prozess zum Hinzufügen einer einfachen C#-Komponente zu Ihrem C++/WinRT-Projekt.
Visual Studio erleichtert das Erstellen und Bereitstellen eigener benutzerdefinierter Windows-Runtime-Typen innerhalb eines mit C# oder Visual Basic geschriebenen WRC-Projekts (Windows-Runtime-Komponente). Anschließend können Sie von einem C++-Anwendungsprojekt aus auf dieses WRC verweisen und die benutzerdefinierten Typen von dieser Anwendung verwenden.
Intern können Ihre Windows-Runtime-Typen alle .NET-Funktionen verwenden, die in einer UWP-Anwendung zulässig sind.
Hinweis
Weitere Informationen finden Sie unter Windows-Runtime-Komponenten mit C# und Visual Basic und .NET für UWP-Anwendungen – Übersicht.
Von außen können die Mitglieder Ihres Typs nur Windows-Runtime-Typen für ihre Parameter und Rückgabewerte bereitstellen. Wenn Sie Ihre Lösung erstellen, erstellt Visual Studio Ihr .NET-WRC-Projekt und führt dann einen Bauschritt aus, der eine Windows-Metadatendatei (.winmd) erstellt. Dies ist Ihre Windows-Runtime-Komponente (WRC), die Visual Studio in Ihrer App enthält.
Hinweis
.NET ordnet einige häufig verwendete .NET-Typen, z. B. primitive Datentypen und Sammlungstypen, automatisch ihren Windows-Runtime-Entsprechungen zu. Diese .NET-Typen können in der öffentlichen Schnittstelle einer Komponente für Windows-Runtime verwendet werden und werden Benutzern der Komponente als die entsprechenden Windows-Runtime-Typen angezeigt. Siehe Komponenten für Windows-Runtime mit C# und Visual Basic.
Voraussetzungen
- Windows 10
- Microsoft Visual Studio
Erstellen einer leeren App
Erstellen Sie in Visual Studio ein neues Projekt mit der Projektvorlage Leere App (C++/WinRT). Stellen Sie sicher, dass Sie die Vorlage (C++/WinRT) verwenden und nicht die Vorlage (Universal Windows).
Benennen Sie das neue Projekt in CppToCSharpWinRT um, damit Ihre Ordnerstruktur mit der Anleitung übereinstimmt.
Hinzufügen einer C#-Komponente für Windows-Runtime zur Lösung
Erstellen Sie in Visual Studio das Komponentenprojekt: Öffnen Sie im Projektmappen-Explorer das Kontextmenü für die CppToCSharpWinRT Projektmappe, und wählen Sie Hinzufügenaus, und wählen Sie dann Neues Projekt aus, um der Projektmappe ein neues C#-Projekt hinzuzufügen. Wählen Sie im Abschnitt Installierte Vorlagen des Dialogfelds Neues Projekt hinzufügenVisual C#aus, und wählen Sie dann Windowsaus, und dann Universal. Wählen Sie die Windows Runtime-Komponente (Universal Windows) Vorlage aus, und geben Sie SampleComponent für den Projektnamen ein.
Hinweis
Wählen Sie im Dialogfeld Projekt für die neue universelle Windows-PlattformWindows 10 Creators Update (10.0; Build 15063) als Mindestversion. Weitere Informationen finden Sie im Abschnitt Anwendungs-Mindestversion unten.
Hinzufügen der C#-GetMyString-Methode
Ändern Sie im SampleComponent Projekt den Namen der Klasse von Class1- in Example. Fügen Sie der Klasse dann zwei einfache Elemente hinzu: ein privates int-Feld und eine Instanzmethode mit dem Namen GetMyString.
public sealed class Example { int MyNumber; public string GetMyString() { return $"This is call #: {++MyNumber}"; } }
Hinweis
Standardmäßig ist die Klasse öffentlich versiegeltmarkiert. Alle Windows-Runtime-Klassen, die Sie aus Ihrer Komponente verfügbar machen, müssen versiegeltsein.
Hinweis
Optional: Um IntelliSense für die neu hinzugefügten Mitglieder zu aktivieren, öffnen Sie im Projektmappen-Explorer das Kontextmenü für das SampleComponent--Projekt, und wählen Sie dann Buildaus.
Verweisen Sie auf das C#-SampleComponent aus dem CppToCSharpWinRT-Projekt
Öffnen Sie im Projektmappen-Explorer im C++/WinRT-Projekt das Kontextmenü für Verweise, und wählen Sie dann Verweis hinzufügen aus, um das Dialogfeld Verweis hinzufügen zu öffnen. Wählen Sie Projekteaus, und wählen Sie dann Lösungaus. Aktivieren Sie das Kontrollkästchen für das SampleComponent-Projekt und wählen Sie OK aus, um einen Verweis hinzuzufügen.
Hinweis
Optional: Um IntelliSense für das C++/WinRT-Projekt zu aktivieren, öffnen Sie im Projektmappen-Explorer das Kontextmenü für das CppToCSharpWinRT--Projekt, und wählen Sie dann Buildaus.
MainPage.h bearbeiten
Öffnen Sie MainPage.h im CppToCSharpWinRT-Projekt und fügen Sie dann zwei Elemente hinzu. Fügen Sie zuerst #include "winrt/SampleComponent.h" am Ende der #include-Anweisungen hinzu, und ergänzen Sie dann ein winrt::SampleComponent::Example-Feld zur MainPage-Struktur.
// MainPage.h
...
#include "winrt/SampleComponent.h"
namespace winrt::CppToCSharpWinRT::implementation
{
struct MainPage : MainPageT<MainPage>
{
...
winrt::SampleComponent::Example myExample;
...
};
}
Hinweis
In Visual Studio MainPage.h ist unter MainPage.xaml.
MainPage.cpp bearbeiten
In MainPage.cpp die Mainpage::ClickHandler Implementierung ändern, um die C#-Methode GetMyString aufzurufen.
void MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
//myButton().Content(box_value(L"Clicked"));
hstring myString = myExample.GetMyString();
myButton().Content(box_value(myString));
}
Projekt ausführen
Sie können jetzt das Projekt erstellen und ausführen. Jedes Mal, wenn Sie auf die Schaltfläche klicken, erhöht sich die Zahl in der Schaltfläche.
screenshot 
Tipp
Erstellen Sie in Visual Studio das Komponentenprojekt: Öffnen Sie im Projektmappen-Explorer das Kontextmenü für das CppToCSharpWinRT- Projekt, und wählen Sie Eigenschaftenaus, und wählen Sie dann Debuggen unter Konfigurationseigenschaftenaus. Legen Sie den Debuggertyp auf Managed und Native fest, wenn Sie sowohl den C#-Code (verwaltet) als auch den C++-Code (nativ) debuggen möchten.
Mindestversion der Anwendung
Die Anwendungs-Minimum- der C#-Projektversion steuert die Version von .NET, die zum Kompilieren der Anwendung verwendet wird. Wenn Sie beispielsweise Windows 10 Fall Creators Update (10.0; Build 16299) oder höher wählen, wird .NET Standard 2.0 sowie die Unterstützung für Windows-Arm64-Prozessoren aktiviert.
Tipp
Es wird empfohlen, anwendungsminderte Versionen unter 16299 zu verwenden, um zusätzliche Buildkonfigurationen zu vermeiden, wenn die Unterstützung von .NET Standard 2.0 oder Arm64 nicht erforderlich ist.
Konfigurieren für Windows 10 Fall Creators Update (10.0; Build 16299)
Führen Sie die folgenden Schritte aus, um die Unterstützung von .NET Standard 2.0 oder Windows Arm64 in den C#-Projekten zu aktivieren, auf die von Ihrem C++/WinRT-Projekt verwiesen wird.
Wechseln Sie in Visual Studio zur Projektmappenübersicht und öffnen Sie das Rechtsklickmenü für das CppToCSharpWinRT--Projekt. Wählen Sie Eigenschaften aus, und legen Sie die Min-Version der universellen Windows-App auf Windows 10 Fall Creators Update (10.0; Build 16299) (oder höher). Führen Sie die gleichen Schritte für das SampleComponent Projekt aus.
Öffnen Sie in Visual Studio das Kontextmenü für das CppToCSharpWinRT- Projekt, und wählen Sie Projekt entladen aus, um CppToCSharpWinRT.vcxproj im Text-Editor zu öffnen.
Kopieren Sie den folgenden XML-Code, und fügen Sie ihn in das erste PropertyGroup in CPPWinRTCSharpV2.vcxprojein.
<!-- 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 -->
Die Werte für DotNetNativeVersion, DotNetNativeSharedLibraryund UWPCoreRuntimeSdkVersion können je nach Version von Visual Studio variieren. Um sie auf die richtigen Werte festzulegen, öffnen Sie %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages und prüfen Sie die Unterverzeichnisse für jeden Wert in der folgenden Tabelle. Das %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler-Verzeichnis hat ein Unterverzeichnis, das eine installierte Version von .NET Native enthält, die mit 2.2 beginnt. Im folgenden Beispiel ist es 2.2.12-rel-31116-00.
MSBuild-Variable Verzeichnis Beispiel 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
Hinweis
Es gibt mehrere unterstützte Architekturen für Microsoft.Net.Native.SharedLibrary. Ersetzen Sie x64 durch die entsprechende Architektur. Die arm64-Architektur befindet sich beispielsweise im Verzeichnis %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-arm64.microsoft.net.native.sharedlibrary.
Fügen Sie als Nächstes direkt nach dem ersten PropertyGroupFolgendes (unverändert) hinzu.
<!-- 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 -->
Fügen Sie am Ende der Projektdatei unmittelbar vor dem schließenden Project Tag folgendes (unverändert) hinzu.
<!-- 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 -->
Laden Sie die Projektdatei in Visual Studio neu. Öffnen Sie dazu im Visual Studio-Projektmappen-Explorer das Kontextmenü für das CppToCSharpWinRT- Projekt, und wählen Sie Projekt erneut ladenaus.
Erstellung für .NET Native
Es wird empfohlen, Ihre Anwendung mit der C#-Komponente zu erstellen und zu testen, die mit .NET native erstellt wurde. Öffnen Sie in Visual Studio das Kontextmenü für das CppToCSharpWinRT- Projekt, und wählen Sie Projekt entladen aus, um CppToCSharpWinRT.vcxproj im Text-Editor zu öffnen.
Legen Sie als Nächstes die Eigenschaft UseDotNetNativeToolchain auf true für die Release- und Arm64-Konfigurationen in der C++-Projektdatei fest.
Öffnen Sie im Visual Studio-Projektmappen-Explorer das Kontextmenü für das CppToCSharpWinRT-Projekt und wählen Sie Projekt neu ladenaus.
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
...
<UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)'=='Arm64'" Label="Configuration">
<UseDotNetNativeToolchain Condition="'$(UseDotNetNativeToolchain)'==''">true</UseDotNetNativeToolchain>
</PropertyGroup>
Verweisen auf andere C#-„NuGet“-Pakete
Wenn die C#-Komponente auf andere Nuget-Paketeverweist, benötigt die Projektdatei der Anwendung möglicherweise Listendateiabhängigkeiten aus dem Nuget-Paket als Bereitstellungsinhalt. Wenn beispielsweise die C#-Komponente auf das Newtonsoft.Json-Nuget-Paket verweist, sollte auch im Anwendungsprojekt auf das gleiche Nuget-Paket und die Dateiabhängigkeit verwiesen werden.
Fügen Sie in der Datei SampleComponent.csproj den nuget-Paketverweis hinzu:
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.1</Version>
</PackageReference>
Suchen Sie im CppToCSharpWinRT--Projekt die packages.config Datei, und fügen Sie den passenden NuGet-Verweis hinzu. Dadurch wird das Nuget-Paket im Paketordner der Lösung installiert.
Fügen Sie in packages.configdenselben NuGet-Paketverweis hinzu:
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="native" developmentDependency="true" />
Fügen Sie dann der Anwendungsprojektdatei Folgendes hinzu, um auf die entsprechende Dateiabhängigkeit aus dem Paketordner der Lösung zu verweisen. Fügen Sie beispielsweise in CppToCSharpWinRT.vcxproj Folgendes hinzu:
<ItemGroup>
<None Include="..\packages\Newtonsoft.Json.13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll">
<Link>%(Filename)%(Extension)</Link>
<DeploymentContent>true</DeploymentContent>
</None>
</ItemGroup>