Partilhar via


Pacotes de estrutura MSIX e dependências dinâmicas

Este artigo apresenta conceitos importantes relacionados aos pacotes de estrutura MSIX . As informações neste artigo fornecem contexto útil para ajudá-lo a entender melhor o design e a finalidade do recurso de dependências dinâmicas no SDK de aplicativos Windows e no sistema operacional Windows 11. Esse recurso permite que seus aplicativos façam referência e usem pacotes de estrutura MSIX em tempo de execução.

Pacotes de estrutura e o gráfico de pacotes

O MSIX é um formato de pacote que fornece uma experiência moderna de empacotamento e implantação. Ele também fornece uma maneira limpa e confiável de empacotar bibliotecas, conteúdo e componentes redistribuíveis por meio de pacotes de estrutura MSIX. Um pacote de estrutura MSIX permite que aplicativos empacotados acessem componentes por meio de uma única fonte compartilhada no dispositivo do usuário, em vez de agrupá-los no pacote do aplicativo. Os pacotes de estrutura comuns incluem o SDK do Aplicativo Windows (incluindo WinUI3), WinUI2, VCLibs e o Tempo de Execução do DirectX.

Começando no Windows 8 e continuando pelo Windows 10 e Windows 11, cada processo tem um gráfico de pacotes que fornece a lista de todos os pacotes disponíveis para a aplicação, incluindo framework, recursos, opcionais e principais. Este gráfico permite que o aplicativo carregue DLLs, conteúdo e declarações de classe em tempo de execução fornecidas por um pacote referenciado. Historicamente, esse gráfico era fixado no tempo de criação do processo, e não havia como alterá-lo em tempo de execução:

  • Para aplicativos empacotados, o gráfico foi inicializado com base nas dependências do pacote declaradas no elemento PackageDependency no manifesto do pacote do aplicativo. Ao criar uma aplicação pacotada, isso geralmente era feito para si durante o processo de compilação, com base nas referências e dependências do projeto.
  • Para aplicativos não empacotados, o gráfico do pacote estava vazio e não podia ser alterado. Portanto, os aplicativos não empacotados estavam limitados à ordem de pesquisa de DLL padrão e não podiam acessar pacotes de framework.

Essa restrição de grafo de pacote estático é levantada com a introdução do suporte a dependências dinâmicas no Windows App SDK e no Windows 11. Os desenvolvedores podem usar dependências dinâmicas para referenciar e usar pacotes de estrutura MSIX de seus aplicativos em tempo de execução. As dependências dinâmicas removem a restrição de gráfico de pacote estático dos aplicativos, e os desenvolvedores podem decidir como desejam tirar partido dos pacotes de framework.

Cenários principais para dependências dinâmicas

Embora as dependências dinâmicas permitam que qualquer aplicativo adicione uma dependência de estrutura de pacote em tempo de execução, esse recurso destina-se principalmente a ser usado por aplicativos empacotados com local externo ou aplicativos não empacotados. Os aplicativos embalados ainda podem continuar a adicionar dependências estáticas por meio do elemento PackageDependency no manifesto do seu pacote.

Modelo de manutenção para pacotes de estrutura

O recurso de dependências dinâmicas preserva a integridade do pipeline de manutenção para o pacote de estrutura que está sendo referenciado e usado dinamicamente em tempo de execução.

Os pacotes de estrutura MSIX suportam manutenção em um modelo lado a lado, o que significa que cada versão é instalada em sua própria pasta versionada separada. Isso permite que os aplicativos em uso possam permanecer em funcionamento mesmo quando um aplicativo mais recente instala uma versão mais recente do pacote de estrutura. O sistema operacional tem lógica de desinstalação para quando excluir versões mais antigas de um determinado pacote de estrutura, com base na presença de referências de tempo de instalação e referências de tempo de execução para o pacote.

  • Quando uma aplicação é instalada, ela pode criar uma referência durante a instalação a um pacote de framework. Essa referência informa ao sistema operacional que o aplicativo tem uma dependência do pacote de estrutura especificado para que o sistema operacional não desinstale o pacote de estrutura enquanto seu aplicativo estiver instalado.
  • Quando uma aplicação precisa usar APIs ou conteúdo num pacote de framework, pode adicionar uma referência de tempo de execução ao pacote de framework. Essa referência específica informa ao SO que o pacote do framework está em uso ativo e deve gerenciar as atualizações de versão simultaneamente. Se uma nova versão do pacote de estrutura estiver instalada, mas um aplicativo em execução tiver uma versão mais antiga em uso, o sistema operacional não poderá remover a versão mais antiga até que todas as referências em tempo de execução à versão mais antiga sejam removidas.

Por exemplo, dado este cenário:

  • App A está em execução e usando a versão 1.0.0.0 de um determinado pacote de estrutura.
  • O aplicativo B está instalado e depende da versão 1.0.0.1 do mesmo pacote de estrutura.

Nesse cenário, ambas as versões do pacote de estrutura serão instaladas e em uso pelo aplicativo A e pelo aplicativo B. No entanto, quando o aplicativo A é fechado pelo usuário e, em seguida, reiniciado, ele pegará a versão mais recente 1.0.0.1 do pacote de estrutura. Neste ponto, o requisito de referência em tempo de execução não é mais válido para a versão 1.0.0.0 do pacote de estrutura e o sistema operacional pode remover com segurança a versão 1.0.0.0. Mais tarde, quando o utilizador desinstalar o App A e o App B , o requisito de referência no momento da instalação deixará de ser válido, e é seguro para o sistema operativo remover totalmente o pacote de framework.

Para aplicativos empacotados que usam o elemento PackageDependency para especificar referências estáticas a pacotes de estrutura, as referências de tempo de instalação para pacotes de estrutura são controladas pelo sistema operacional quando o aplicativo é instalado ou desinstalado. Para referências de tempo de execução que são gerenciadas usando o recurso de dependências dinâmicas, o sistema operacional sabe quando um aplicativo empacotado está em execução e evitará remover seus pacotes de estrutura em uso quando um mais recente estiver disponível.