Compartilhar via


Pacotes de estrutura MSIX e dependências dinâmicas

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

Pacotes de framework e o grafo de pacotes

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 redistribuíveis, conteúdo e componentes 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 agrupar-os no pacote do aplicativo. Os pacotes de estrutura comuns incluem o do SDK do Aplicativo Windows (incluindo WinUI3), WinUI2, VCLibse o Runtime do DirectX.

Começando no Windows 8 e continuando por meio do Windows 10 e windows 11, cada processo tem um grafo de pacote que fornece a lista de todos os pacotes disponíveis para o aplicativo, incluindo estrutura, recurso, pacotes opcionais e principais. Esse grafo 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 grafo foi corrigido no momento da criação do processo e não havia como alterá-lo em tempo de execução:

  • Para aplicativos empacotados, o grafo foi inicializado com base nas dependências do pacote declaradas no elemento PackageDependency no manifesto do pacote do aplicativo. Ao criar um aplicativo empacotado, isso normalmente era feito para você durante o processo de compilação com base nas suas referências e dependências do projeto.
  • Para aplicativos não empacotados, o grafo do pacote estava vazio e não podia ser alterado. Portanto, os aplicativos não empacotados eram limitados à ordem de pesquisa padrão de DLL conforme e não podiam acessar pacotes de estrutura.

Essa restrição de pacotes estáticos é removida com a introdução do suporte a dependências dinâmicas tanto no SDK de Aplicativos do Windows (e), quanto no Windows 11. Os desenvolvedores podem usar dependências dinâmicas para fazer referência e usar pacotes de framework MSIX em aplicativos durante a execução. As dependências dinâmicas removem a restrição de grafo de pacote estático dos aplicativos, e os desenvolvedores podem decidir como desejam aproveitar os pacotes de framework.

Cenários primários para dependências dinâmicas

Embora as dependências dinâmicas permitam que qualquer aplicativo adicione uma dependência de estrutura de pacotes em tempo de execução, esse recurso destina-se principalmente a ser usado por aplicativos empacotados com localização externa ou aplicativos não empacotados. Os aplicativos empacotados podem continuar a adicionar dependências estáticas por meio do elemento PackageDependency no manifesto do 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 framework que está sendo referenciado e usado dinamicamente durante a execução.

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

  • Quando um aplicativo é instalado, ele pode criar uma referência de tempo de instalação para um pacote de estrutura. Essa referência informa ao sistema operacional que o aplicativo tem uma dependência sobre o pacote de estrutura especificado para que o sistema operacional não desinstale o pacote da estrutura enquanto seu aplicativo estiver instalado.
  • Quando um aplicativo precisa usar APIs ou conteúdo em um pacote de estrutura, ele pode adicionar uma referência em tempo de execução ao pacote de estrutura. Essa referência informa ao sistema operacional que o pacote de framework está em uso ativo e para lidar com as atualizações de versão de maneira paralela. Se uma nova versão do pacote da 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, considerando este cenário:

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

Nesse cenário, ambas as versões do pacote framework serão instaladas e em uso por App A e App B. No entanto, quando App A for fechado pelo usuário e reiniciado, ele passará a usar a versão mais recente 1.0.0.1 do pacote framework. 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. Posteriormente, quando aplicativo A e aplicativo B são desinstalados pelo usuário, o requisito de referência no momento da instalação não é mais válido, e é seguro para o sistema operacional remover totalmente o pacote de estrutura.

Para aplicativos empacotados que usam o elemento PackageDependency para especificar referências estáticas a pacotes de framework, as referências aos pacotes de framework durante a instalação são controladas pelo sistema operacional quando o aplicativo é instalado ou desinstalado. Para referências em 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.