Aplicar o Package Support Framework no Visual Studio

O PSF (Package Support Framework) é um projeto código aberto que permite aplicar correções ao aplicativo da área de trabalho existente. O PSF permite que um aplicativo seja executado em um formato empacotado MSIX sem modificar o código. O Package Support Framework ajuda seu aplicativo a seguir as melhores práticas do ambiente moderno do runtime.

Nas seções a seguir, exploraremos como criar um novo projeto de Visual Studio, incluir o Package Support Framework para a solução e criar correções de runtime.

Etapa 1: Criar uma solução de pacote no Visual Studio

Em Visual Studio, crie um novo Visual Studio Solutions, solução em branco. Inclua todos os projetos de aplicativo para a solução em branco recém-criada.

Etapa 2: Adicionar um projeto de empacotamento

Se você ainda não tiver um Windows Project de Empacotamento de Aplicativos, crie um e adicione-o à sua solução. Crie um novo Visual C# –> Windows Universal –> Windows Project de Empacotamento de Aplicativos e adicione-o à sua solução recém-criada.

Para obter mais informações sobre Windows projeto de Empacotamento de Aplicativos, consulte Empacotar seu aplicativo usando Visual Studio.

Em Gerenciador de Soluções, clique com o botão direito do mouse no projeto de empacotamento, selecione Editar Project Arquivo e, em seguida, adicione-o à parte inferior do arquivo de projeto:

...
  <Target Name="PSFRemoveSourceProject" AfterTargets="ExpandProjectReferences" BeforeTargets="_ConvertItems">
    <ItemGroup>
      <FilteredNonWapProjProjectOutput Include="@(_FilteredNonWapProjProjectOutput)">
      <SourceProject Condition="'%(_FilteredNonWapProjProjectOutput.SourceProject)'=='_Runtime fix project name_'" />
      </FilteredNonWapProjProjectOutput>
      <_FilteredNonWapProjProjectOutput Remove="@(_FilteredNonWapProjProjectOutput)" />
      <_FilteredNonWapProjProjectOutput Include="@(FilteredNonWapProjProjectOutput)" />
    </ItemGroup>
  </Target>
</Project>

Etapa 3: Adicionar projeto para a correção de runtime

Adicione um novo projeto de DLL (Biblioteca de Dynamic-Link) do Visual C++ –>> Windows Desktop à solução.

Em seguida, clique com o botão direito do mouse no projeto e escolha Propriedades.

Na página de propriedades, localize as Propriedades de Configuração –> C/C++ –> Idioma –> campo Padrão da Linguagem C++ . Em seguida, selecione ISO C++17 Standard (/std:c++17) no menu suspenso.

Clique com o botão direito do mouse no projeto e, no menu de contexto, escolha a opção Gerenciar Pacotes Nuget . Verifique se a opção de origem do pacote está definida como Todos ou nuget.org.

Clique no ícone de configurações ao lado desse campo.

Pesquise os pacotes Nuget para PSF e instale o Microsoft.PackageSupportFramework para este projeto.

nuget package

Etapa 4: Adicionar um projeto que inicie o executável do Inicializador PSF

Adicionar um novo Visual C++ –> Geral –> Project vazia à solução.

Execute as seguintes etapas:

  1. Clique com o botão direito do mouse nesse projeto e, no menu de contexto, escolha a opção Gerenciar Pacotes Nuget . Verifique se a opção de origem do pacote está definida como Todos ou nuget.org.
  2. Clique no ícone de configurações ao lado desse campo.
  3. Pesquise os pacotes Nuget para PSF e instale o Microsoft.PackageSupportFramework para este projeto.

Abra as páginas de propriedades do projeto e, na página de configurações gerais, defina a propriedade PSFLauncher32Nome de Destino como ou PSFLauncher64 dependendo da arquitetura do aplicativo.

Adicione uma referência de projeto ao projeto de correção de runtime em sua solução.

Clique com o botão direito do mouse na referência e, na janela Propriedades , aplique esses valores.

Propriedade Valor
Copiar local True
Assemblies Satélite do Local da Cópia True
Saída do Assembly de Referência True
Dependências da Biblioteca de Links Falso
Entradas de dependência da biblioteca de link Falso

Etapa 5: Configurar o projeto de empacotamento

Para configurar o projeto de empacotamento, execute as seguintes etapas:

  1. No projeto de empacotamento, clique com o botão direito do mouse na pasta Aplicativos e escolha Adicionar Referência no menu suspenso.
  2. Escolha o projeto inicializador de PSF e seu projeto de aplicativo da área de trabalho e escolha o botão OK .
  3. Selecione o Inicializador PSF e o projeto Aplicativo da Área de Trabalho e clique no botão Ok. Se o código-fonte do aplicativo não estiver disponível, selecione apenas o projeto inicializador PSF.
  4. No nó Aplicativos , clique com o botão direito do mouse no aplicativo Inicializador PSF e escolha Definir como Ponto de Entrada.

Adicione um arquivo nomeado config.json ao projeto de empacotamento e, em seguida, copie e cole o texto json a seguir no arquivo. Defina a propriedade Ação do Pacote como Conteúdo.

{
    "applications": [
        {
            "id": "",
            "executable": "",
            "workingDirectory": ""
        }
    ],
    "processes": [
        {
            "executable": "",
            "fixups": [
                {
                    "dll": "",
                    "config": {
                    }
                }
            ]
        }
    ]
}

Forneça um valor para cada chave. Use essa tabela como um guia.

Array chave Valor
de dimensionamento da Web id Use o valor do Id atributo do Application elemento no manifesto do pacote.
de dimensionamento da Web executável O caminho relativo ao pacote para o executável que você deseja iniciar. Na maioria dos casos, você pode obter esse valor do arquivo de manifesto do pacote antes de modificá-lo. É o valor do Executable atributo do Application elemento.
de dimensionamento da Web workingDirectory (Opcional) Um caminho relativo ao pacote a ser usado como o diretório de trabalho do aplicativo iniciado. Se você não definir esse valor, o sistema operacional usará o System32 diretório como diretório de trabalho do aplicativo.
processos executável Na maioria dos casos, esse será o nome do executable configurado acima com o caminho e a extensão de arquivo removidos.
Correções dll Caminho relativo ao pacote para a DLL de correção a ser carregada.
Correções config (Opcional) Controla como a DLL de correção se comporta. O formato exato desse valor varia de acordo com a correção por correção, pois cada correção pode interpretar esse "blob" como desejar.

Quando terminar, seu config.json arquivo será semelhante a este.

{
  "applications": [
    {
      "id": "DesktopApplication",
      "executable": "DesktopApplication/WinFormsDesktopApplication.exe",
      "workingDirectory": "WinFormsDesktopApplication"
    }
  ],
  "processes": [
    {
      "executable": ".*App.*",
      "fixups": [ { "dll": "RuntimeFix.dll" } ]
    }
  ]
}

Observação

As applicationsteclas , processese fixups as chaves são matrizes. Isso significa que você pode usar o arquivo config.json para especificar mais de um aplicativo, processo e correção de DLL.

Depurar uma correção de runtime

Em Visual Studio, pressione F5 para iniciar o depurador. A primeira coisa que começa é o aplicativo PSF Launcher, que, por sua vez, inicia seu aplicativo de área de trabalho de destino. Para depurar o aplicativo de área de trabalho de destino, você precisará anexar manualmente ao processo de aplicativo da área de trabalho escolhendo Depurar-Anexar> ao Processo e, em seguida, selecionar o processo do aplicativo. Para permitir a depuração de um aplicativo .NET com uma DLL de correção de runtime nativa, selecione tipos de código gerenciados e nativos (depuração de modo misto).

Você pode definir pontos de interrupção ao lado de linhas de código no código do aplicativo da área de trabalho e no projeto de correção de runtime. Se você não tiver o código-fonte para seu aplicativo, poderá definir pontos de interrupção apenas ao lado de linhas de código no projeto de correção do runtime.