Aplicativos MSIX AppContainer

O tópico AppContainer para aplicativos herdados abrange todas as informações básicas necessárias sobre o que é o ambiente AppContainer e seus benefícios. Esse tópico também contém exemplos de código C# e C++ para testar se um processo está ou não em execução em um AppContainer.

O tópico que você está lendo agora mostra como pode configurar facilmente um aplicativo empacotado usando MSIX para ser executado no ambiente AppContainer (em um contêiner de aplicativo leve). Os aplicativos da Plataforma Universal do Windows (UWP) são automaticamente aplicativos AppContainer. Mas você também pode configurar seu aplicativo da área de trabalho empacotado com MSIX para ser um aplicativo AppContainer.

O processo de um aplicativo AppContainer e seus processos filhos são executados dentro de um contêiner de aplicativo leve, em que podem acessar apenas os recursos que lhes são especificamente concedidos. E eles são isolados utilizando a virtualização do sistema de arquivos e do registro. Como resultado, os aplicativos implementados em um AppContainer não podem ser invadidos para permitir ações mal-intencionadas fora dos recursos limitados atribuídos.

Dica

Aplicativos não empacotados também podem ser executados em um AppContainer. Porém, é particularmente fácil usar o AppContainer se você empacota usando o MSIX. Portanto, todos os cenários descritos neste tópico se referem a aplicativos empacotados.

Configurar um projeto WinUI 3 para AppContainer

As etapas em Criar um novo projeto para um aplicativo da área de trabalho WinUI 3 C# ou C++ empacotado mostram a maneira padrão e recomendada de criar um novo projeto WinUI 3.

Por padrão, o arquivo Package.appxmanifest do projeto contém a configuração de um pacote de confiança total (ou seja, nível de integridade médio). As seções relevantes têm a seguinte aparência:

...
<Applications>
  <Application ...
    EntryPoint="$targetentrypoint$">
    ...
  </Application>
</Applications>

<Capabilities>
  <rescap:Capability Name="runFullTrust" />
</Capabilities>
...

Para configurar o pacote como contendo um aplicativo AppContainer, você pode editar o atributo EntryPoint e remover a declaração de capacidade restrita (mas manter o elemento Capabilities). Dessa forma:

...
<Applications>
  <Application ...
    EntryPoint="windows.partialTrustApplication">
    ...
  </Application>
</Applications>

<Capabilities/>
...

Se o pacote for instalado no Windows 10, versão 2004 (10.0; Compilação 19041) e/ou posterior, em vez de definir EntryPoint, você poderá definir uap10:TrustLevel e uap10:RuntimeBehavior (depois de declarar o prefixo do namespace XML, conforme mostrado). Dessa forma:

<Package ...
  xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10"
  ...>
...
  <Applications>
    <Application ...
      EntryPoint="$targetentrypoint$"
      uap10:TrustLevel="appContainer"
      uap10:RuntimeBehavior="packagedClassicApp">
      ...
    </Application>
  </Applications>

  <Capabilities/>
...

Para obter mais informações, consulte estes tópicos:

Configurar uma solução de dois projetos do WinUI 3 para AppContainer

A seção anterior descreveu o processo para MSIX de projeto único, que recomendamos e que é o padrão para novos projetos WinUI 3. Para obter mais informações, confira Empacotar o aplicativo usando o MSIX de projeto único.

Porém, você pode ter um projeto WinUI 3 anterior à introdução do recurso MSIX de projeto único. Nesse caso, você terá dois projetos em sua solução: seu projeto de aplicativo, além de um projeto de empacotamento de aplicativos do Windows adicional. Se você puder migrar seu projeto para MSIX de projeto único, isso será ideal. E você poderá seguir as diretrizes da seção anterior. Para obter mais informações, confira Empacotar o aplicativo usando o MSIX de projeto único.

Se você não pode migrar seu projeto para MSIX de projeto único, esta seção descreve como configurar seu pacote como contendo um aplicativo AppContainer.

Um Projeto de Empacotamento de Aplicativos do Windows implica uma configuração padrão que substitui a configuração no Package.appxmanifest. O projeto se comporta como se houvesse uma propriedade TrustLevel no arquivo de projeto definida como um valor Full.

Para remediar esse valor de propriedade implícito, expanda o nó Dependencies>Applications do projeto de empacotamento e selecione o nó que representa a referência a seu projeto WinUI 3. Em seguida, na janela Propriedades do Visual Studio (não propriedades do projeto), para a propriedade Nível de Confiança, escolha o valor de Confiança Parcial.

O arquivo de projeto do projeto de empacotamento agora contém esta propriedade explícita:

...
<ItemGroup>
  <ProjectReference Include="...">
    <TrustLevel>Partial</TrustLevel>
  </ProjectReference>
</ItemGroup>
...

E agora você pode remover <rescap:Capability Name="runFullTrust" /> do arquivo Package.appxmanifest do projeto de empacotamento.

Configurar um projeto de aplicativo do Windows (aplicativo do tipo WndProc do Win32 do C++) para AppContainer

Esta seção é para você caso tenha um projeto C++ Win32 WndProc-type que foi criado com o modelo de Projeto de Aplicativo do Windows. Em poucas palavras, a primeira etapa é adicionar à sua solução um Projeto de Empacotamento de Aplicativos do Windows em C++. Há mais detalhes sobre as etapas exatas em Configurar seu aplicativo da área de trabalho para empacotamento MSIX no Visual Studio. Esse tópico se aplica a aplicativos de área de trabalho escritos em C++ ou C#.

Em seguida, abra o arquivo de projeto do novo projeto de empacotamento e adicione uma propriedade TrustLevel à propriedade ProjectReference existente da seguinte maneira:

...
<ItemGroup>
  <ProjectReference Include="...">
    <TrustLevel>Partial</TrustLevel>
  </ProjectReference>
</ItemGroup>
...

Ao compilar, você poderá ver o "erro APPX1673: elemento necessário 'PhoneIdentity' ausente no manifesto do aplicativo". Se isso acontecer, edite o arquivo Package.appxmanifest do projeto da seguinte maneira:

<Package ...
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  ...>
...
  <mp:PhoneIdentity
      PhoneProductId="A GUID in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx."
      PhonePublisherId="A GUID in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.">
  </mp:PhoneIdentity>
...

Configurar um projeto WPF ou WinForms para AppContainer

Esta seção é para você caso tenha:

  • um projeto de aplicativo do Windows Presentation Foundation (WPF) que foi criado com o modelo de projeto de aplicativo WPF em C#. Isso lhe dará um projeto .NET; e é diferente do modelo de projeto chamado Aplicativo WPF (.NET Framework). Ou
  • um projeto de aplicativo do Windows Forms (WinForms) que foi criado com o modelo de projeto Aplicativo do Windows Forms em C#. Isso lhe dará um projeto .NET; e é diferente do modelo de projeto chamado Aplicativo do Windows Forms (.NET Framework).

Em poucas palavras, a primeira etapa é adicionar à sua solução um Projeto de Empacotamento de Aplicativos do Windows em C#. Há mais detalhes sobre as etapas exatas em Configurar seu aplicativo da área de trabalho para empacotamento MSIX no Visual Studio.

Em seguida, expanda o nó Dependencies>Applications do projeto de empacotamento e selecione o nó que representa a referência a seu projeto WPF ou WinForms. Em seguida, na janela Propriedades do Visual Studio (não propriedades do projeto), para a propriedade Nível de Confiança, escolha o valor de Confiança Parcial.