Partilhar via


Usar a linha de comando winapp com .NET

Observação

Este guia funciona para a maioria dos tipos de projetos .NET. Os passos foram testados tanto com projetos de consola como de interface como o WPF.

Este guia demonstra como usar a linha de comando winapp com uma aplicação .NET para depurar com a identidade do pacote e empacotar a sua aplicação como MSIX.

A identidade de pacote é um conceito central no modelo de Windows app. Permite que a sua aplicação acesse APIs específicas do Windows (como Notificações, Segurança, APIs de IA, etc.), tenha uma experiência limpa de instalação/desinstalação e muito mais.

Pré-requisitos

  1. .NET SDK: Instalar o SDK .NET:

    winget install Microsoft.DotNet.SDK.10 --source winget
    
  2. Winapp CLI: Instale a winapp ferramenta via winget:

    winget install Microsoft.winappcli --source winget
    

1. Criar uma nova aplicação .NET

Comece por criar uma aplicação simples de consola .NET:

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

Executa para garantir que tudo está a funcionar:

dotnet run

2. Atualizar código para verificar identidade

Primeiro, atualize o ficheiro do seu projeto para apontar 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. Fugir sem identidade

dotnet run

Deves ver "Não embalado".

4. Inicialize o projeto com o winapp CLI

O comando winapp init deteta automaticamente ficheiros .csproj e executa uma configuração específica para .NET:

winapp init

Quando solicitado:

  • Nome do pacote: Pressione Enter para aceitar o padrão
  • Nome do Publicador: Pressione Enter para aceitar o padrão ou inserir o 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)
  • Configuração do Windows App SDK: Selecione Estável, Pré-visualização ou Experimental

Este comando:

  • Atualiza o TargetFramework no seu .csproj para um TFM suportado por Windows (se necessário)
  • Adiciona referências de pacotes NuGet Microsoft.WindowsAppSDK e Microsoft.Windows.SDK.BuildTools
  • Cria appxmanifest.xml e Assets pastas para a identidade da tua aplicação

Observação

Ao contrário dos projetos nativos/C++, o fluxo do .NET não cria um ficheiro winapp.yaml. Os pacotes NuGet são geridos diretamente pelo seu .csproj. Uso dotnet restore para restaurar pacotes após clonagem.

5. Depuração com identidade

  1. Constrói 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 ficheiro executável (não use dotnet run, pois pode reconstruir):

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

Você deve ver:

Package Family Name: dotnet-app_12345abcde

Automatização da identidade de depuração (opcional)

Adicione este destino ao seu .csproj ficheiro:

<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. Utilização do Windows App SDK

Se executaste winapp init, Microsoft.WindowsAppSDK já foi adicionado como uma referência de pacote NuGet. Atualize Program.cs para utilizar a API de Tempo de Execução do App Windows.

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. Pacote com MSIX

  1. Build para lançamento:

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

    winapp cert generate --if-exists skip
    
  3. Embalagem e assinatura:

    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 ficheiro gerado .msix .

Sugestão

  • A Microsoft Store assina o MSIX por si, não precisa de assinar antes de submeter.
  • Pode precisar de pacotes MSIX separados para cada arquitetura: dotnet build -c Release -r win-x64 ou dotnet build -c Release -r win-arm64.

Automatização da embalagem MSIX (opcional)

Adicione este alvo 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>