Applicare il Package Support Framework in Visual Studio

Package Support Framework (PSF) è un progetto di open source che consente di applicare correzioni all'applicazione desktop esistente. Il PSF consente a un'applicazione di eseguire in un formato in pacchetto senza modificare il codice. PSF consente di seguire le procedure consigliate degli ambienti di runtime moderni per le app.

Nelle sezioni seguenti verrà illustrato come creare un nuovo progetto di Visual Studio, includere Package Support Framework nella soluzione e creare correzioni di runtime.

Passaggio 1: Creare una soluzione pacchetto in Visual Studio

In Visual Studio creare una nuova soluzione Di Visual Studio, soluzione vuota. Includere tutti i progetti dell'applicazione alla soluzione vuota appena creata.

Passaggio 2: Aggiungere un progetto di creazione di pacchetti

Se non si dispone già di un progetto di creazione pacchetti applicazioni di Windows, crearne uno e aggiungerlo alla soluzione. Creare un nuovo progetto Visual C# - Windows Universal ->> Windows Application Packaging Project e aggiungerlo alla soluzione appena creata.

Per altre informazioni sul progetto Di creazione pacchetti di applicazioni di Windows, vedere Creare un pacchetto dell'applicazione usando Visual Studio.

In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto di creazione pacchetti, selezionare Modifica file di progetto e quindi aggiungerlo nella parte inferiore del file di progetto:

...
  <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>

Passaggio 3: Aggiungere un progetto per la correzione del runtime

Aggiungere un nuovo progetto Visual C++ - Windows Desktop ->> libreria di Dynamic-Link (DLL) alla soluzione.

Fare quindi clic con il pulsante destro del mouse sul progetto e scegliere Proprietà.

Nella pagina delle proprietà individuare il campo Configuration Properties - C/C++ - Language ->> C++ Language> - C++ Language Standard. Selezionare quindi ISO C++17 Standard (/std:c++17) dal menu a discesa.

Fare clic con il pulsante destro del mouse sul progetto e scegliere l'opzione Gestisci pacchetti Nuget nel menu di scelta rapida. Assicurarsi che l'opzione origine pacchetto sia impostata su All o nuget.org.

Fare clic sull'icona delle impostazioni accanto a tale campo.

Cercare i pacchetti Nuget per PSF, quindi installare Microsoft.PackageSupportFramework per questo progetto.

pacchetto nuget

Passaggio 4: Aggiungere un progetto che avvia l'eseguibile del launcher PSF

Aggiungere un nuovo oggetto Visual C++ - Generale ->> Progetto vuoto alla soluzione.

Eseguire i passaggi seguenti:

  1. Fare clic con il pulsante destro del mouse sul progetto e scegliere l'opzione Gestisci pacchetti Nuget nel menu di scelta rapida. Assicurarsi che l'opzione origine pacchetto sia impostata su All o nuget.org.
  2. Fare clic sull'icona delle impostazioni accanto a tale campo.
  3. Cercare i pacchetti Nuget per PSF, quindi installare Microsoft.PackageSupportFramework per questo progetto.

Aprire le pagine delle proprietà per il progetto e nella pagina Impostazioni generali impostare la proprietà Nome di destinazione su PSFLauncher32 o PSFLauncher64 a seconda dell'architettura dell'applicazione.

Aggiungere un riferimento al progetto di correzione del runtime nella soluzione.

Fare clic con il pulsante destro del mouse sul riferimento e quindi nella finestra Proprietà applicare questi valori.

Proprietà Valore
Copiare localmente True
Copia assembly satellite locale True
Output assembly di riferimento True
Collega dipendenze di libreria False
Input di dipendenza della libreria di collegamenti False

Passaggio 5: Configurare il progetto di creazione del pacchetto

Per configurare il progetto di creazione del pacchetto, seguire questa procedura:

  1. Nel progetto di creazione pacchetti fare clic con il pulsante destro del mouse sulla cartella Applicazioni e scegliere Aggiungi riferimento dal menu a discesa.
  2. Scegliere il progetto launcher PSF e il progetto dell'applicazione desktop e quindi scegliere il pulsante OK .
  3. Selezionare sia il programma di avvio PSF che il progetto Applicazione desktop , quindi fare clic sul pulsante Ok. Se il codice sorgente dell'applicazione non è disponibile, selezionare solo il progetto launcher PSF.
  4. Nel nodo Applicazioni fare clic con il pulsante destro del mouse sull'applicazione PSF Launcher e scegliere Imposta come punto di ingresso.

Aggiungere un file denominato config.json al progetto di creazione pacchetti, quindi copiare e incollare il testo json seguente nel file. Impostare la proprietà Azione pacchetto su Contenuto.

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

Specificare un valore per ogni chiave. Usare questa tabella come riferimento.

Array Key Valore
scala Web id Utilizzare il valore dell'attributo dell'elemento IdApplication nel manifesto del pacchetto.
scala Web eseguibile Percorso relativo del pacchetto al file eseguibile che si vuole avviare. Nella maggior parte dei casi, è possibile ottenere questo valore dal file manifesto del pacchetto prima di modificarlo. È il valore dell'attributo dell'elemento ExecutableApplication .
scala Web Workingdirectory (Facoltativo) Percorso relativo al pacchetto da usare come directory di lavoro dell'applicazione che inizia. Se non si imposta questo valore, il sistema operativo usa la System32 directory come directory di lavoro dell'applicazione.
processes eseguibile Nella maggior parte dei casi, questo sarà il nome dell'oggetto configurato in precedenza con il percorso e l'estensione executable del file rimossa.
correzioni Libreria dll Percorso relativo del pacchetto alla DLL di correzione da caricare.
correzioni config (Facoltativo) Controlla il comportamento della DLL di correzione. Il formato esatto di questo valore varia in base a una correzione per correzione perché ogni correzione può interpretare questo "BLOB" come vuole.

Al termine, il config.json file avrà un aspetto simile al seguente.

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

Nota

Le applicationschiavi , processese fixups sono matrici. Ciò significa che è possibile usare il file config.json per specificare più di un'applicazione, un processo e una DLL di correzione.

Eseguire il debug di una correzione del runtime

In Visual Studio premere F5 per avviare il debugger. La prima cosa che inizia è l'applicazione PSF Launcher, che a sua volta avvia l'applicazione desktop di destinazione. Per eseguire il debug dell'applicazione desktop di destinazione, è necessario collegare manualmente al processo dell'applicazione desktop scegliendo Debug-Attach> to Process e quindi selezionando il processo dell'applicazione. Per consentire il debug di un'applicazione .NET con una DLL di correzione del runtime nativo, selezionare tipi di codice gestiti e nativi (debug in modalità mista).

È possibile impostare punti di interruzione accanto a righe di codice nel codice dell'applicazione desktop e nel progetto di correzione del runtime. Se non si dispone del codice sorgente per l'applicazione, sarà possibile impostare i punti di interruzione solo accanto a righe di codice nel progetto di correzione del runtime.