Publicar um aplicativo .NET MAUI empacotado para Windows com a CLI

Ao distribuir seu aplicativo de interface do usuário de aplicativo de várias plataformas do .NET (.NET MAUI) para Windows, você pode publicar o aplicativo e suas dependências em uma pasta para implantação em outro sistema. Você também pode empacotar o aplicativo em um pacote MSIX, que tem inúmeros benefícios para os usuários que instalam seu aplicativo. Para obter mais informações sobre os benefícios do MSIX, consulte O que é MSIX?

Gerar um certificado de assinatura

Você deve usar um certificado de autenticação para uso na publicação do aplicativo. Esse certificado é usado para assinar o pacote MSIX. As etapas a seguir demonstram como criar e instalar um certificado autoassinado com o PowerShell:

Observação

Quando você cria e usa um certificado autoassinado, somente os usuários que instalam e confiam em seu certificado podem executar seu aplicativo. Isso é fácil de implementar para teste, mas pode impedir que usuários adicionais instalem seu aplicativo. Quando você estiver pronto para publicar seu aplicativo, recomendamos que você use um certificado emitido por uma fonte confiável. Esse sistema de confiança centralizada ajuda a garantir que o ecossistema do aplicativo tenha níveis de verificação para proteger os usuários contra atores mal-intencionados.

  1. Abra um terminal do PowerShell e navegue até o diretório com seu projeto.

  2. Use o comando New-SelfSignedCertificate para gerar um certificado autoassinado.

    O valor <PublisherName> é exibido para o usuário quando ele instala seu aplicativo, fornece seu próprio valor e omite os caracteres < >. Você pode definir o parâmetro FriendlyName como qualquer cadeia de caracteres de texto desejada.

    New-SelfSignedCertificate -Type Custom `
                              -Subject "CN=<PublisherName>" `
                              -KeyUsage DigitalSignature `
                              -FriendlyName "My temp dev cert" `
                              -CertStoreLocation "Cert:\CurrentUser\My" `
                              -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")
    
  3. Use o seguinte comando do PowerShell para consultar o repositório de certificados para o certificado que foi criado:

    Get-ChildItem "Cert:\CurrentUser\My" | Format-Table Thumbprint, Subject, FriendlyName
    

    Você verá resultados semelhantes à seguinte saída:

    Thumbprint                               Subject                                  FriendlyName
    ----------                               -------                                  ------------
    DE8B962E7BF797CB48CCF66C8BCACE65C6585E2F CN=1f23fa36-2a2f-475e-a69e-3a14fe56ed4
    A6CA34FD0BA6B439787391F51C87B1AD0C9E7FAE CN=someone@microsoft.com
    94D93DBC97D4F7E4364A215F15C6ACFEFC71E569 CN=localhost                             ASP.NET Core HTTPS development certificate
    F14211566DACE867DA0BF9C2F9C47C01E3CF1D9B CN=john
    568027317BE8EE5E6AACDE5079D2DE76EC46EB88 CN=e1f823e2-4674-03d2-aaad-21ab23ad84ae
    DC602EE83C95FEDF280835980E22306067EFCA96 CN=John Smith, OU=MSE, OU=Users, DC=com
    07AD38F3B646F5AAC16F2F2570CAE40F4842BBE0 CN=Contoso                               My temp dev cert
    
  4. A Impressão Digital do certificado será usada posteriormente, portanto, copie-a para a área de transferência. É o valor da Impressão Digital cuja entrada corresponde ao Assunto e ao FriendlyName do seu certificado.

Para obter mais informações, consulte Criar um certificado para assinatura de pacote.

Definir as configurações de build do projeto

O arquivo de projeto é um bom lugar para colocar as configurações de build específicas do Windows. Talvez você não queira colocar algumas configurações no arquivo de projeto, como senhas. As configurações descritas nesta seção podem ser passadas na linha de comando com o formato -p:name=value. Se a configuração já estiver definida no arquivo de projeto, uma configuração passada na linha de comando substituirá a configuração do projeto.

Adicione o nó <PropertyGroup> a seguir ao arquivo de projeto. Esse grupo de propriedades só é processado quando a estrutura de destino é o Windows e a configuração é definida como Release. Esta seção de configuração é executada sempre que um build ou publica no modo Release.

<PropertyGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows' and '$(Configuration)' == 'Release'">
    <AppxPackageSigningEnabled>true</AppxPackageSigningEnabled>
    <PackageCertificateThumbprint>A10612AF095FD8F8255F4C6691D88F79EF2B135E</PackageCertificateThumbprint>
</PropertyGroup>
<PropertyGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows' and '$(RuntimeIdentifierOverride)' != ''">
    <RuntimeIdentifier>$(RuntimeIdentifierOverride)</RuntimeIdentifier>
</PropertyGroup>

Substitua o valor da propriedade <PackageCertificateThumbprint> pela impressão digital do certificado gerada anteriormente. Como alternativa, você pode remover essa configuração do arquivo de projeto e fornecê-la na linha de comando. Por exemplo: -p:PackageCertificateThumbprint=A10612AF095FD8F8255F4C6691D88F79EF2B135E.

O segundo <PropertyGroup> no exemplo é necessário para contornar um bug no SDK do Windows. Para obter mais informações sobre o bug, consulte Problema nº 3337 do WindowsAppSDK.

Publicar

Para publicar seu aplicativo, abra o Prompt de Comando do Desenvolvedor para o terminal do VS 2022 e navegue até a pasta do projeto de aplicativo .NET MAUI. Execute o comando dotnet publish, fornecendo os seguintes parâmetros:

Parâmetro Valor
-f A estrutura de destino, que é net8.0-windows{version}. Esse valor é um TFM do Windows, como net8.0-windows10.0.19041.0. Verifique se esse valor é idêntico ao valor no nó <TargetFrameworks> no arquivo .csproj.
-c A configuração do build, que é Release.
-p:RuntimeIdentifierOverride=win10-x64
- ou -
-p:RuntimeIdentifierOverride=win10-x86
Evita o bug detalhado em problema nº 3337 do WindowsAppSDK. Escolha a versão -x64 ou -x86 do parâmetro com base na plataforma de destino.

Aviso

A tentativa de publicar uma solução MAUI do .NET resultará na tentativa do comando dotnet publish de publicar cada projeto na solução individualmente, o que pode causar problemas quando você adicionou outros tipos de projeto à sua solução. Portanto, o comando dotnet publish deve ser definido como escopo para seu projeto de aplicativo MAUI do .NET.

Por exemplo:

dotnet publish -f net8.0-windows10.0.19041.0 -c Release -p:RuntimeIdentifierOverride=win10-x64

Observação

No .NET 8, o comando dotnet publish usa como padrão a configuração Release. Portanto, a configuração de build pode ser omitida da linha de comando.

Publicar compila e empacota o aplicativo, copiando o pacote assinado para a pasta bin\Release\net8.0-windows10.0.19041.0\win10-x64\AppPackages\<appname>\. <appname> é uma pasta com o nome do projeto e da versão. Nessa pasta, há um arquivo msix e esse é o pacote do aplicativo.

Para obter mais informações sobre o comando dotnet publish, consulte dotnet publish.

Como instalar a ferramenta

Para instalar o aplicativo, ele deve ser assinado com um certificado em que você já confia. Se não estiver, o Windows não permitirá que você instale o aplicativo. Você receberá uma caixa de diálogo semelhante à seguinte, com o botão Instalar desabilitado:

Installing an untrusted app.

Observe que, na imagem anterior, o Publicador era "desconhecido".

Para confiar no certificado do pacote do aplicativo, execute as seguintes etapas:

  1. Clique com o botão direito do mouse no arquivo .msix e escolha Propriedades.

  2. Selecione a guia Assinaturas Digitais.

  3. Escolha o certificado e pressione Detalhes.

    Properties pane of an MSIX file with the digital signatures tab selected.

  4. Selecione o Exibir Certificado.

  5. Selecione Instalar Certificado....

  6. Escolha o Computador Local e, em seguida, selecione Avançar.

    Se você for solicitado pelo Controle de Conta de Usuário a Permitir que esse aplicativo faça alterações em seu dispositivo?, selecione Sim.

  7. Na janela Assistente de Importação de Certificados, selecione Colocar todos os certificados no repositório a seguir.

  8. Selecione Procurar... e escolha o repositório Pessoas Confiáveis. Selecione OK para fechar a caixa de diálogo.

    Certificate import wizard window is shown while selecting the Trusted People store.

  9. Selecione Avançar e, em seguida, Concluir. Você deve ver uma caixa de diálogo que diz: A importação foi bem-sucedida.

    Certificate import wizard window with a successful import message.

  10. Selecione OK em qualquer janela aberta como parte desse processo, para fechá-los todos.

Agora, tente abrir o arquivo de pacote novamente para instalar o aplicativo. Você deverá ver uma caixa de diálogo semelhante à seguinte, com o Publicador exibido corretamente:

Installing a trusted app.

Selecione o botão Instalar se quiser instalar o aplicativo.

Limitações atuais

A lista a seguir descreve as limitações atuais com publicação e empacotamento:

  • O aplicativo publicado não funcionará se você tentar executá-lo diretamente com o arquivo executável fora da pasta de publicação.
  • A forma correta de executar o aplicativo é primeiro instalá-lo por meio do arquivo MSIX empacotado.