Compartilhar via


Usando a CLI do Winapp com .NET

Observação

Este guia funciona para a maioria dos tipos de projeto .NET. As etapas foram testadas com projetos baseados em console e interface do usuário, como WPF.

Este guia demonstra como usar a CLI do winapp em um aplicativo .NET para depurar utilizando a identidade do pacote e empacotar seu aplicativo no formato MSIX.

A identidade do pacote é um conceito básico no modelo de Windows app. Ele permite que seu aplicativo acesse APIs específicas do Windows (como Notificações, Segurança, APIs de IA etc.), e tenha uma experiência de instalação/desinstalação limpa, entre outras funcionalidades.

Pré-requisitos

  1. .NET SDK: instale o SDK do .NET:

    winget install Microsoft.DotNet.SDK.10 --source winget
    
  2. CLI do winapp: instale a winapp ferramenta por meio do winget:

    winget install Microsoft.winappcli --source winget
    

1. Criar um novo aplicativo .NET

Comece criando um aplicativo de console .NET simples:

dotnet new console -n dotnet-app
cd dotnet-app

Execute-o para verificar se tudo está funcionando:

dotnet run

2. Atualizar código para verificar a identidade

Primeiro, atualize o arquivo project para direcionar uma versão específica do SDK do Windows. Abra dotnet-app.csproj e altere o TargetFramework:

<TargetFramework>net10.0-windows10.0.26100.0</TargetFramework>

Agora substitua o conteúdo de Program.cs:

using Windows.ApplicationModel;

try
{
    var package = Package.Current;
    var familyName = package.Id.FamilyName;
    Console.WriteLine($"Package Family Name: {familyName}");
}
catch (InvalidOperationException)
{
    Console.WriteLine("Not packaged");
}

3. Executar sem identificação

dotnet run

Você deve ver "Não empacotado".

4. Inicie o projeto com a CLI do winapp

O comando winapp init detecta automaticamente arquivos .csproj e executa uma configuração específica .NET:

winapp init

Quando solicitado:

  • Nome do pacote: Pressione Enter para aceitar o padrão
  • Nome do publicador: pressione Enter para aceitar o valor padrão ou insira seu nome
  • Descrição: pressione Enter para aceitar o padrão ou inserir uma descrição
  • Versão: Pressione Enter para aceitar 1.0.0.0
  • Ponto de entrada: pressione Enter para aceitar o padrão (dotnet-app.exe)
  • Windows App SDK configuração: Selecione Estável, Visualização ou Experimental

Esse comando:

  • Atualiza o TargetFramework em seu .csproj para um TFM compatível com o Windows (se necessário)
  • Adiciona Microsoft.WindowsAppSDK e Microsoft.Windows.SDK.BuildTools referências de pacote NuGet
  • Cria as pastas appxmanifest.xml e Assets para a identidade do aplicativo

Observação

Ao contrário de projetos nativos/C++, o fluxo de .NET não cria um arquivo winapp.yaml. Os pacotes NuGet são gerenciados diretamente por meio de sua .csproj. Use dotnet restore para restaurar pacotes após a clonagem.

5. Depurar com identidade

  1. Crie o executável:

    dotnet build -c Debug
    
  2. Aplicar identidade de depuração:

    winapp create-debug-identity .\bin\Debug\net10.0-windows10.0.26100.0\dotnet-app.exe
    
  3. Execute o arquivo executável (não use dotnet run pois ele pode recompilar):

    .\bin\Debug\net10.0-windows10.0.26100.0\dotnet-app.exe
    

Você deve ver:

Package Family Name: dotnet-app_12345abcde

Automatizando a identidade de debug (opcional)

Adicione este destino ao arquivo .csproj :

<Target Name="ApplyDebugIdentity" AfterTargets="Build" Condition="'$(Configuration)' == 'Debug'">
    <Exec Command="winapp create-debug-identity &quot;$(TargetDir)$(TargetName).exe&quot;"
          WorkingDirectory="$(ProjectDir)"
          IgnoreExitCode="false" />
</Target>

6. Usando Windows App SDK

Se você executou winapp init, Microsoft.WindowsAppSDK já foi adicionado como uma referência de pacote NuGet. Atualize Program.cs para usar a API Windows App Runtime:

using Windows.ApplicationModel;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            var package = Package.Current;
            var familyName = package.Id.FamilyName;
            Console.WriteLine($"Package Family Name: {familyName}");

            var runtimeVersion = Microsoft.Windows.ApplicationModel.WindowsAppRuntime.RuntimeInfo.AsString;
            Console.WriteLine($"Windows App Runtime Version: {runtimeVersion}");
        }
        catch (InvalidOperationException)
        {
            Console.WriteLine("Not packaged");
        }
    }
}

7. Empacotar com MSIX

  1. Compilar para lançamento:

    dotnet build -c Release
    
  2. Gerar um certificado de desenvolvimento:

    winapp cert generate --if-exists skip
    
  3. Empacotar e assinar:

    winapp pack .\bin\Release\net10.0-windows10.0.26100.0 --manifest .\appxmanifest.xml --cert .\devcert.pfx
    
  4. Instalar o certificado (executar como administrador):

    winapp cert install .\devcert.pfx
    
  5. Instale clicando duas vezes no arquivo gerado .msix .

Dica

  • A Microsoft Store assina o MSIX para você, não é necessário assinar antes do envio.
  • Talvez você precise de pacotes MSIX separados para cada arquitetura: dotnet build -c Release -r win-x64 ou dotnet build -c Release -r win-arm64.

Automatizando o empacotamento MSIX (opcional)

Adicione este destino ao seu .csproj:

<Target Name="PackageMsix" AfterTargets="Build" Condition="'$(Configuration)' == 'Release'">
    <Exec Command="winapp pack &quot;$(TargetDir.TrimEnd('\'))&quot; --cert &quot;$(ProjectDir)devcert.pfx&quot;"
          WorkingDirectory="$(ProjectDir)"
          IgnoreExitCode="false" />
</Target>