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.
C#/WinRT bietet Unterstützung für die Erstellung Windows Runtime Komponenten, einschließlich benutzerdefinierter WinUI-Typen und benutzerdefinierter Steuerelemente. Diese Komponenten können von C#- oder C++/WinRT-Anwendungen genutzt werden, die die Windows App SDK verwenden. Wir empfehlen die Verwendung von C#/WinRT v1.6.4 oder höher, um Laufzeitkomponenten mit NuGet-Paketunterstützung zu erstellen.
Weitere Informationen zu den unterstützten Szenarien finden Sie unter Authoring C#/WinRT components in the C#/WinRT GitHub repo.
In dieser exemplarischen Vorgehensweise wird das Erstellen einer C#-Komponente mit einem benutzerdefinierten WinUI-Steuerelement und das Verwenden dieser Komponente aus einer C++/WinRT-App mithilfe der Windows App SDK project-Vorlagen veranschaulicht.
Voraussetzungen
Für diese Schritt-für-Schritt-Anleitung sind die folgenden Werkzeuge und Komponenten erforderlich:
- Visual Studio 2022
- .NET 6.0 SDK
- Windows App SDK VSIX (1,1 aus dem stabilen Kanal)
Erstellen Sie Ihre C#/WinRT-Komponente mithilfe des Windows App SDK
Erstellen Sie ein neues C#-Bibliotheksprojekt mithilfe der Vorlage Class Library (WinUI in Desktop), die vom Windows App SDK bereitgestellt wird. Für diese Anleitung haben wir das Bibliotheksprojekt WinUIComponentCs und die Lösung AuthoringWinUI benannt.
Lassen Sie das Kontrollkästchen Solution und Projekt im selben Verzeichnis ablegen nicht ausgewählt (andernfalls wird der Ordner
packagesfür die C++-Anwendung im vorherigen Abschnitt das C#-Bibliotheksprojekt beeinträchtigen).
Löschen Sie die
Class1.csStandardmäßig enthaltene Datei.Installieren Sie das neueste Microsoft.Windows.CsWinRT NuGet-Paket in Ihrem project.
i. Klicken Sie in Solution Explorer mit der rechten Maustaste auf den Knoten project, und wählen Sie Manage NuGet Packages aus.
ii. Suchen Sie nach dem Microsoft.Windows.CsWinRT NuGet-Paket, und installieren Sie die neueste Version.
Fügen Sie Ihrem Bibliothek-Projekt die folgenden Eigenschaften hinzu:
<PropertyGroup> <CsWinRTComponent>true</CsWinRTComponent> </PropertyGroup>- Die eigenschaft
CsWinRTComponentgibt an, dass ihr project eine Windows Runtime Komponente ist, sodass beim Erstellen des project eine.winmddatei generiert wird.
- Die eigenschaft
Fügen Sie Ihrer Bibliothek ein benutzerdefiniertes Steuerelement oder ein Benutzersteuerelement hinzu. Klicken Sie hierzu in Visual Studio mit der rechten Maustaste auf Ihr Projekt, klicken Sie auf Add>Neues Element, und wählen Sie im linken Seitenbereich WinUI aus. Für diese exemplarische Vorgehensweise haben wir ein neues Benutzersteuerelement (WinUI) hinzugefügt und benannt
NameReporter.xaml. Das NameReporter Benutzersteuerelement ermöglicht es einem Benutzer, einen Vor- und Nachnamen in das entsprechende TextBox--Steuerelement einzugeben und auf eine Schaltfläche zu klicken. Das Steuerelement zeigt dann ein Meldungsfeld mit dem Namen an, den der Benutzer eingegeben hat.Fügen Sie den folgenden Code in die
NameReporter.xamlDatei ein:<UserControl x:Class="WinUIComponentCs.NameReporter" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:WinUIComponentCs" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <StackPanel HorizontalAlignment="Center"> <StackPanel.Resources> <Style x:Key="BasicTextStyle" TargetType="TextBlock" BasedOn="{StaticResource BodyTextBlockStyle}"> <Setter Property="Margin" Value="10,10,10,10"/> </Style> </StackPanel.Resources> <TextBlock Text="Enter your name." Margin="0,0,0,10"/> <StackPanel Orientation="Horizontal" Margin="0,0,0,10"> <TextBlock Style="{StaticResource BasicTextStyle}"> First Name: </TextBlock> <TextBox Name="firstName" /> </StackPanel> <StackPanel Orientation="Horizontal" Margin="0,0,0,10"> <TextBlock Style="{StaticResource BasicTextStyle}"> Last Name: </TextBlock> <TextBox Name="lastName" /> </StackPanel> <Button Content="Submit" Click="Button_Click" Margin="0,0,0,10"/> <TextBlock Name="result" Style="{StaticResource BasicTextStyle}" Margin="0,0,0,10"/> </StackPanel> </UserControl>Fügen Sie die folgende Methode zum
NameReporter.xaml.cshinzu:using System.Text; ... private void Button_Click(object sender, RoutedEventArgs e) { StringBuilder displayText = new StringBuilder("Hello, "); displayText.AppendFormat("{0} {1}.", firstName.Text, lastName.Text); result.Text = displayText.ToString(); }Sie können jetzt das WinUIComponentCs-Projekt kompilieren, um eine
.winmdDatei für die Komponente zu generieren.
Hinweis
Sie können die Komponente auch als NuGet-Paket verpacken, damit Endbenutzer der Anwendung darauf verweisen können. Weitere Informationen finden Sie unter Authoring C#/WinRT components on the C#/WinRT Github repo.
Verweisen auf die Komponente aus einer Windows App SDK C++/WinRT-App
Die folgenden Schritte zeigen, wie Sie die Komponente verwenden, die aus dem vorherigen Abschnitt in einer C++/WinRT-Anwendung mit dem Windows App SDK erstellt wurde. Die Verwendung einer C#/WinRT-Komponente aus C++ erfordert derzeit die Verwendung der Single-Project-Blank App, Packaged (WinUI in Desktop) Vorlage. Beachten Sie, dass C#-Komponenten auch von C#-verpackten Apps ohne Klassenregistrierungen referenziert werden können.
Die Nutzung von verpackten Apps, die ein separates Windows Application Packaging (WAP)-Projekt verwenden, wird derzeit nicht unterstützt. Weitere Informationen finden Sie unter Authoring C#/WinRT components im C#/WinRT GitHub Repository für die neuesten Updates zu unterstützten Projektkonfigurationen.
Fügen Sie Ihrer Lösung ein neues C++ Windows App-SDK-Anwendungsprojekt hinzu. Klicken Sie in Visual Studio mit der rechten Maustaste auf Ihre Lösung, und wählen Sie Add>Neue Project aus. Wählen Sie die C++-Blank App, Packaged (WinUI in Desktop)-Vorlage aus, die von dem Windows App SDK bereitgestellt wird. Für diese Anleitung haben wir die App CppAppbenannt.
Fügen Sie der C#-Komponente einen Projektverweis von der C++-App hinzu. Klicken Sie in Visual Studio mit der rechten Maustaste auf die C++-project, und wählen Sie Add>Reference aus, und wählen Sie die WinUIComponentCs project aus.
Hinweis
Die Nutzung von Komponenten als NuGet-Paketreferenz wird mit einigen Einschränkungen unterstützt. Komponenten mit benutzerdefinierten Benutzersteuerelementen können derzeit nicht als NuGet-Paketreferenz genutzt werden.
Fügen Sie in der Kopfzeilendatei
pch.hder App die folgenden Zeilen hinzu:#include <winrt/WinUIComponentCs.h> #include <winrt/WinUIComponentCs.WinUIComponentCs_XamlTypeInfo.h>Öffnen Sie die Paketmanifestdatei,
Package.appxmanifest.Hinweis
Es gibt ein bekanntes Problem, bei dem die datei
Package.appxmanifestnicht in Visual Studio Solution Explorer angezeigt wird. Um dies zu umgehen, klicken Sie mit der rechten Maustaste auf Ihre C++-project, wählen Sie Unload Project aus, und doppelklicken Sie auf die project, um die DateiCppApp.vcxprojzu öffnen. Fügen Sie der datei project den folgenden Eintrag hinzu, und laden Sie dann die project neu:<ItemGroup> <AppxManifest Include="Package.appxmanifest"> <SubType>Designer</SubType> </AppxManifest> </ItemGroup>Fügen Sie in
Package.appxmanifestdie folgenden aktivierbaren Klassenregistrierungen hinzu. Sie benötigen außerdem einen zusätzlichenActivatableClassEintrag für die WinUIComponentCs.WinUIComponentCs_XamlTypeInfo.XamlMetaDataProvider- Klasse, um die WinUI-Typen zu aktivieren. Klicken Sie mit der rechten Maustaste auf diePackage.appxmanifestDatei, und wählen Sie Mit>XML (Text-Editor) öffnen aus, um die Datei zu bearbeiten.<!--In order to host the C# component from C++, you must add the following Extension group and list the activatable classes--> <Extensions> <Extension Category="windows.activatableClass.inProcessServer"> <InProcessServer> <Path>WinRT.Host.dll</Path> <ActivatableClass ActivatableClassId="WinUIComponentCs.NameReporter" ThreadingModel="both" /> <ActivatableClass ActivatableClassId="WinUIComponentCs.WinUIComponentCs_XamlTypeInfo.XamlMetaDataProvider" ThreadingModel="both" /> </InProcessServer> </Extension> </Extensions>Öffnen Sie die Datei
MainWindow.xaml.i. Fügen Sie oben in der Datei einen Verweis auf den Namespace der Komponente hinzu.
xmlns:custom="using:WinUIComponentCs"ii. Fügen Sie das Benutzersteuerelement dem vorhandenen XAML-Code hinzu.
<StackPanel> ... <custom:NameReporter/> </StackPanel>Legen Sie CppApp als Start-project fest. Klicken Sie mit der rechten Maustaste auf CppApp, und wählen Sie Set as Startup Project aus. Legen Sie die Lösungskonfiguration auf
x86. Vor dem Erstellen müssen Sie Ihre Lösung möglicherweise auch neu ausrichten, um sie mit den Buildtools von Visual Studio 2022 zu erstellen. Klicken Sie mit der rechten Maustaste auf die Lösung, wählen Sie Retarget-Lösungaus, und aktualisieren Sie das Platform-Toolset auf v143.Erstellen Sie die App, und führen Sie sie aus, um das benutzerdefinierte NameReporter--Steuerelement anzuzeigen.
Bekannte Probleme
- Für die Verwendung einer C#-Komponente als Projektverweis muss
PublishReadyToRunaufFalsefestgelegt werden. Weitere Informationen finden Sie unter Github Problem Nr. 1151. - Das Verwenden einer C#-Komponente, die für
AnyCPUaus C++ erstellt wurde, wird nur vonx86-Anwendungen unterstützt.x64undArm64Apps führen zu einem Laufzeitfehler ähnlich wie folgt: %1 ist keine gültige Win32-Anwendung. Weitere Informationen finden Sie unter Github-Problem #1151.
Zugehörige Themen
Windows developer