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 in einem mit C# oder Visual Basic geschriebenen Windows-Runtime-Komponentenprojekt (WRC) sowie das Verweisen auf diese WRC aus einem C++-Anwendungsprojekt und das Verwenden dieser benutzerdefinierten Typen in der Anwendung.
Intern können Ihre Windows-Runtime Typen jede .NET Funktionalität verwenden, die in einer UWP-Anwendung zulässig ist.
Note
Weitere Informationen finden Sie unter Windows-Runtime Komponenten mit C# und Visual Basic und .NET für UWP-Apps ( Übersicht).
Extern können die Elemente Ihres Typs nur Windows-Runtime Typen für ihre Parameter und Rückgabewerte verfügbar machen. Wenn Sie Ihre Lösung erstellen, erstellt Visual Studio Ihr .NET WRC-Projekt und führt dann einen Buildschritt aus, der eine Windows Metadatendatei (WINMD) erstellt. Dies ist Ihre Windows-Runtime Komponente (WRC), die Visual Studio in Ihre App einschließt.
Note
.NET ordnet einige häufig verwendete .NET-Typen, z. B. primitive Datentypen und Auflistungstypen, automatisch ihren Windows-Runtime-Entsprechungen zu. Diese .NET Typen können in der öffentlichen Schnittstelle einer Windows-Runtime Komponente verwendet werden und werden Benutzern der Komponente als die entsprechenden Windows-Runtime Typen angezeigt. Siehe Windows-Runtime Komponenten 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)" (für WinUI 3-Desktop-Apps, verwenden Sie die Vorlage "Leere App, Verpackt" (WinUI 3 in Desktop). Stellen Sie sicher, dass Sie die Vorlage (C++/WinRT) und nicht die (universelle Windows) verwenden.
Legen Sie den Namen des neuen Projekts auf CppToCSharpWinRT fest, damit die Ordnerstruktur der exemplarischen Vorgehensweise entspricht.
Hinzufügen einer C#-Windows-Runtime Komponente zur Lösung
Erstellen Sie in Visual Studio die Komponente project: Öffnen Sie in Projektmappen-Explorer das Kontextmenü für die CppToCSharpWinRT-Lösung, und wählen Sie "Hinzufügen" aus, und wählen Sie dann "Project Hinzufügen" aus, um der Lösung ein neues C#-project hinzuzufügen. Wählen Sie im Abschnitt "Installierte Vorlagen" im Dialogfeld "Neue Project hinzufügen" die Option "Visual C#" und dann Windows und dann "Universal" aus. Wählen Sie die Vorlage Windows-Runtime-Komponente (Universelle Windows-App) aus und geben Sie SampleComponent als Projektnamen ein.
Note
Wählen Sie im Dialogfeld "Neue Universelle Windows-Plattform Project" Windows 10 Creators Update (10.0; Build 15063) als Mindestversion. Weitere Informationen finden Sie im Abschnitt "Mindestversion der Anwendung " weiter unten.
Hinzufügen der C#-GetMyString-Methode
Ändern Sie im SampleComponent-Projekt den Namen der Klasse von "Class1 " in "Example". Fügen Sie dann der Klasse zwei einfache Member hinzu, ein privates int Feld und eine Instanzmethode namens "GetMyString":
public sealed class Example { int MyNumber; public string GetMyString() { return $"This is call #: {++MyNumber}"; } }
Note
Standardmäßig ist die Klasse als öffentlich versiegelt gekennzeichnet. Alle Windows-Runtime Klassen, die Sie aus Der Komponente verfügbar machen, müssen versiegelt sein.
Note
Optional: Um IntelliSense für die neu hinzugefügten Member zu aktivieren, öffnen Sie in Projektmappen-Explorer das Kontextmenü für das SampleComponent-Projekt, und wählen Sie dann "Erstellen" aus.
Verweisen Sie auf das C#-SampleComponent aus dem CppToCSharpWinRT-Projekt
Öffnen Sie in 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 Projekte und dann Projektmappe aus. Aktivieren Sie das Kontrollkästchen für das SampleComponent-Projekt , und wählen Sie "OK " aus, um einen Verweis hinzuzufügen.
Note
Optional: Um IntelliSense für das C++/WinRT-Projekt zu aktivieren, öffnen Sie in Projektmappen-Explorer das Kontextmenü für das CppToCSharpWinRT-Projekt, und wählen Sie dann "Erstellen" aus.
MainPage.h bearbeiten
Öffnen Sie MainPage.h das CppToCSharpWinRT-Projekt , und fügen Sie dann zwei Elemente hinzu. Fügen Sie zunächst #include "winrt/SampleComponent.h" am Ende der #include-Anweisungen hinzu und 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;
...
};
}
Note
In Visual Studio, MainPage.h ist unter MainPage.xaml aufgeführt.
MainPage.cpp bearbeiten
Ändern Sie in MainPage.cpp die Implementierung von Mainpage::ClickHandler so, dass die C#-Methode GetMyString aufgerufen wird.
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.
Tip
Erstellen Sie in Visual Studio das Komponentenprojekt: Öffnen Sie in Projektmappen-Explorer das Kontextmenü für das CppToCSharpWinRT-Projekt, und wählen Sie "Eigenschaften" aus, und wählen Sie dann "Debuggen" unter "Konfigurationseigenschaften" aus. Legen Sie den Debuggertyp auf "Verwaltet" und "Native " fest, wenn Sie sowohl den C#-Code (verwaltet) als auch den systemeigenen C++-Code debuggen möchten.
Mindestversion der Anwendung
Das 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 auswählen, werden .NET Standard 2.0 und Windows Arm64-Prozessoren unterstützt.
Tip
Es wird empfohlen, anwendungsminderte Versionen unter 16299 zu verwenden, um zusätzliche Buildkonfigurationen zu vermeiden, wenn .NET Unterstützung von 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 .NET Standard 2.0- oder Windows Arm64-Unterstützung in den C#-Projekten zu aktivieren, auf die aus Ihrem C++/WinRT-Projekt verwiesen wird.
Wechseln Sie in Visual Studio zum Projektmappen-Explorer, und öffnen Sie das Kontextmenü für das CppToCSharpWinRT-Projekt. Wählen Sie Eigenschaften aus, und legen Sie die universelle Windows-App Min-Version 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 Projekt CppToCSharpWinRT, 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.vcxproj ein.
<!-- 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 das %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages Unterverzeichnis für jeden Wert in der folgenden Tabelle, und sehen Sie es sich an. Im Verzeichnis %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\Microsoft.Net.Native.Compiler gibt es ein Unterverzeichnis, das eine installierte Version von .NET Native enthält und 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
Note
Es gibt mehrere unterstützte Architekturen für Microsoft. Net.Native.SharedLibrary. Ersetzen Sie x64 durch die entsprechende Architektur. Die arm64-Architektur befände sich beispielsweise im Verzeichnis %ProgramFiles(x86)%\Microsoft SDKs\UWPNuGetPackages\runtime.win10-arm64.microsoft.net.native.sharedlibrary.
Fügen Sie unmittelbar nach dem ersten PropertyGroup als Nächstes Folgendes (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 hinzu (unverändert).
<!-- 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 Projekt CppToCSharpWinRT und wählen Sie Projekt neu laden.
Kompilieren für .NET Native
Es wird empfohlen, Ihre Anwendung mit der C#-Komponente zu erstellen und zu testen, die mit .NET nativen Komponenten erstellt wurde. Öffnen Sie in Visual Studio das Verknüpfungsmenü für das Projekt CppToCSharpWinRT, und wählen Sie Projekt entladen, um CppToCSharpWinRT.vcxproj im Text-Editor zu öffnen.
Legen Sie als Nächstes die UseDotNetNativeToolchain-Eigenschaft in den Release- und Arm64-Konfigurationen in der C++-Projektdatei auf true fest.
Öffnen Sie im Visual Studio Projektmappen-Explorer das Kontextmenü für das Projekt CppToCSharpWinRT und wählen Sie Projekt neu laden aus.
<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-Pakete verweist, 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 entsprechenden Nuget-Verweis hinzu. Dadurch wird das Nuget-Paket im Paketordner der Lösung installiert.
Fügen Sie in packages.config denselben 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>
Zugehörige Themen
Windows developer