Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O C#/WinRT oferece suporte para a autoria de componentes do Windows Runtime, incluindo tipos personalizados WinUI e controlos personalizados. Estes componentes podem ser consumidos tanto a partir de aplicações C# como C++/WinRT que utilizam o SDK de Aplicações Windows. Recomendamos o uso de C#/WinRT v1.6.4 ou posterior para criar componentes de tempo de execução com suporte para empacotamento com NuGet.
Para mais detalhes sobre os cenários suportados, consulte Authoring C#/WinRT components no repositório de GitHub C#/WinRT.
Esta explicação demonstra como criar um componente C# com um controlo WinUI personalizado e como consumir esse componente a partir de uma aplicação C++/WinRT, usando os modelos de projeto do SDK de Aplicações Windows.
Pré-requisitos
Este passo a passo requer as seguintes ferramentas e componentes:
- Visual Studio 2022 ou posterior
- .NET 8.0 SDK (LTS) ou posterior
- SDK de Aplicações Windows VSIX (1.1 a partir do canal estável)
Crie o seu componente C#/WinRT usando o SDK de Aplicações Windows
Crie um novo projeto de biblioteca C# usando o modelo Class Library (WinUI in Desktop) fornecido pelo SDK de Aplicações Windows. Para este guia passo a passo, nomeámos o projeto da biblioteca WinUIComponentCs e a solução AuthoringWinUI.
Deixe a caixa Colocar solução e projeto no mesmo diretório desmarcada (caso contrário, a pasta
packagesda aplicação C++ na seção anterior acabará por interferir com o projeto da biblioteca C#).
Exclua o
Class1.csarquivo incluído por padrão.Instala a versão mais recente Microsoft.Windows. CsWinRT Pacote NuGet no teu projeto.
i) No Explorador de Soluções, clique com o botão direito no nó do projeto e selecione Gerir Pacotes NuGet.
ii. Pesquise pelo pacote NuGet Microsoft.Windows.CsWinRT e instale a versão mais recente.
Adicione as seguintes propriedades ao seu project de biblioteca:
<PropertyGroup> <CsWinRTComponent>true</CsWinRTComponent> </PropertyGroup>- A propriedade
CsWinRTComponentespecifica que o seu projeto é um componente Windows Runtime para que um ficheiro.winmdseja gerado quando constrói o projeto.
- A propriedade
Adicione um controle personalizado ou controle de usuário à sua biblioteca. Para isso, clique com o botão direito no seu projeto em Visual Studio, clique em Adicionar>Novo Item e selecione WinUI no painel esquerdo. Para este guia, adicionámos um novo Controlo do Utilizador (WinUI) e chamámo-lo
NameReporter.xaml. O controlo de utilizador NameReporter permite que um utilizador insira um nome e apelido na caixa de texto apropriada e clique num botão. Em seguida, o controle exibe uma caixa de mensagem com o nome que o usuário inseriu.Cole o seguinte código no
NameReporter.xamlarquivo:<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>Adicione o seguinte método a
NameReporter.xaml.cs: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(); }Agora pode compilar o WinUIComponentCs project para gerar um ficheiro
.winmdpara o componente.
Observação
Você também pode empacotar o componente como um pacote NuGet para os consumidores finais do aplicativo consultarem. Para mais detalhes, veja Authoring C#/WinRT components no repositório de GitHub C#/WinRT.
Referenciar o componente a partir de uma aplicação SDK de Aplicações Windows C++/WinRT
Os passos seguintes mostram como consumir o componente criado a partir da secção anterior a partir de uma aplicação SDK de Aplicações Windows C++/WinRT. Consumir um componente C#/WinRT de C++ requer atualmente o uso do template de projeto único WinUI Blank App (Packaged). Observe que os componentes do C# também podem ser referenciados a partir de aplicativos empacotados em C# sem registros de classe.
O consumo de aplicações empacotadas que utilizam um projeto separado Windows Application Packaging (WAP) não é atualmente suportado. Consulte Authoring C#/WinRT components no repositório GitHub C#/WinRT para as últimas atualizações sobre configurações suportadas de projetos.
Adicione um novo projeto de aplicação C++ para SDK de Aplicações Windows à sua solução. Clique com o botão direito na sua solução em Visual Studio e selecione Adicionar>Novo Project. Selecione o modelo C++ WinUI Blank App (Packaged) fornecido pelo SDK de Aplicações Windows. Para este tutorial, nomeamos a aplicação CppApp.
Adicione uma referência de projeto da aplicação C++ ao componente C#. No Visual Studio, clique com o botão direito no projeto C++ e escolha Add>Reference, e selecione o projeto WinUIComponentCs.
Observação
O consumo de componentes como uma referência de pacote NuGet é suportado com algumas limitações. Ou seja, componentes com controles de usuário personalizados não podem ser consumidos atualmente como uma referência de pacote NuGet.
No arquivo de cabeçalho do
pch.haplicativo, adicione as seguintes linhas:#include <winrt/WinUIComponentCs.h> #include <winrt/WinUIComponentCs.WinUIComponentCs_XamlTypeInfo.h>Abra o arquivo de manifesto do pacote,
Package.appxmanifest.Observação
Há um problema conhecido em que o ficheiro
Package.appxmanifestnão aparece no Visual Studio Explorador de Soluções. Para contornar isso, clique com o botão direito no seu project C++, selecione Descarregar Project e clique duas vezes no project para abrir o ficheiroCppApp.vcxproj. Adicione a seguinte entrada ao ficheiro do project e depois recarregue o project:<ItemGroup> <AppxManifest Include="Package.appxmanifest"> <SubType>Designer</SubType> </AppxManifest> </ItemGroup>No
Package.appxmanifest, adicione os seguintes registos de classes ativáveis. Você também precisará de uma entrada adicionalActivatableClasspara a classe WinUIComponentCs.WinUIComponentCs_XamlTypeInfo.XamlMetaDataProvider, a fim de ativar os tipos WinUI. Clique com o botão direito doPackage.appxmanifestmouse no arquivo e selecione Abrir com>XML (Editor de Texto) para editá-lo.<!--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>Abra o ficheiro
MainWindow.xaml.i) Adicione uma referência ao namespace do componente na parte superior do arquivo.
xmlns:custom="using:WinUIComponentCs"ii. Adicione o controle de usuário ao código XAML existente.
<StackPanel> ... <custom:NameReporter/> </StackPanel>Defina CppApp como projeto de arranque — clique com o botão direito em CppApp e selecione Definir como Projeto de Arranque. Defina a configuração da solução como
x86. Antes de compilar, pode também precisar de redirecionar a sua solução para compilar com as ferramentas de build do Visual Studio 2026. Clique com o botão direito do mouse na solução, selecione Redirecionar solução e atualize o conjunto de ferramentas da plataforma para v143.Crie e execute o aplicativo para ver o controle personalizado NameReporter.
Problemas conhecidos
- Consumir um componente C# como referência de projeto requer que
PublishReadyToRunseja definido paraFalse. Consulte GitHub Edição #1151 para mais detalhes. - O consumo de um componente C# criado para
AnyCPUa partir de C++ é suportado apenas a partir dex86aplicações atualmente.x64eArm64aplicações resultam num erro de execução semelhante a: %1 não é uma aplicação válida do Win32. Ver GitHub Edição #1093 para mais detalhes.
Tópicos relacionados
Windows developer