Anwenden des Frameworks zur Paketunterstützung in Visual Studio

Das Package Support Framework (PSF) ist ein Open Source-Projekt , mit dem Sie Korrekturen auf Ihre vorhandene Desktopanwendung anwenden können. Mit der PSF kann eine Anwendung in einem paketierten Format ausgeführt werden, ohne Code zu ändern. Durch das Package Support Framework können in Ihrer Anwendung die bewährten Methoden moderner Laufzeitumgebungen angewandt werden.

In den folgenden Abschnitten erfahren Sie, wie Sie ein neues Visual Studio-Projekt erstellen, Paketsupportframework zur Lösung hinzufügen und Laufzeitfixes erstellen.

Schritt 1: Erstellen einer Paketlösung in Visual Studio

Erstellen Sie in Visual Studio eine neue Visual Studio-Lösung, leere Projektmappe. Fügen Sie alle Anwendungsprojekte in die neu erstellte leere Projektmappe ein.

Schritt 2: Hinzufügen eines Paketprojekts

Wenn Sie noch nicht über ein Windows Application Packaging-Projekt verfügen, erstellen Sie ein Projekt, und fügen Sie es Zu Ihrer Lösung hinzu. Erstellen Sie ein neues Visual C#-Projekt –> Windows Universal –> Windows Application Packaging Project , und fügen Sie es ihrer neu erstellten Lösung hinzu.

Weitere Informationen zum Windows Application Packaging-Projekt finden Sie unter Packen Ihrer Anwendung mithilfe von Visual Studio.

Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Paketprojekt, wählen Sie "Projektdatei bearbeiten" aus, und fügen Sie dies am Ende der Projektdatei hinzu:

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

Schritt 3: Hinzufügen eines Projekts für die Laufzeitkorrektur

Fügen Sie der Projektmappe ein neues Visual C++ -> Windows Desktop -> Dynamic Link Library (DLL) -Projekt hinzu.

Klicken Sie dann mit der rechten Maustaste auf das Projekt, und wählen Sie dann "Eigenschaften" aus.

Suchen Sie auf der Eigenschaftenseite das Feld "Konfigurationseigenschaften -> C/C++" -> "Sprache -> C++-Sprachstandard" . Wählen Sie dann im Dropdownmenü ISO C++17 Standard (/std:c++17) aus.

Klicken Sie mit der rechten Maustaste auf das Projekt, und wählen Sie dann im Kontextmenü die Option "Nuget-Pakete verwalten" aus. Stellen Sie sicher, dass die Option "Paketquelle " auf " Alle " oder "nuget.org" festgelegt ist.

Klicken Sie auf das Symbol "Einstellungen" neben diesem Feld.

Durchsuchen Sie die Nuget-Pakete für PSF, und installieren Sie dann das Microsoft.PackageSupportFramework für dieses Projekt.

nuget package

Schritt 4: Hinzufügen eines Projekts, das das PSF-Startprogramm ausführbare Datei startet

Fügen Sie der Projektmappe ein neues Visual C++ -> Allgemein -> Leeres Projekt hinzu.

Führen Sie die folgenden Schritte aus:

  1. Klicken Sie mit der rechten Maustaste auf dieses Projekt, und wählen Sie dann im Kontextmenü die Option "Nuget-Pakete verwalten" aus. Stellen Sie sicher, dass die Option "Paketquelle " auf " Alle " oder "nuget.org" festgelegt ist.
  2. Klicken Sie auf das Symbol "Einstellungen" neben diesem Feld.
  3. Durchsuchen Sie die Nuget-Pakete für PSF, und installieren Sie dann das Microsoft.PackageSupportFramework für dieses Projekt.

Öffnen Sie die Eigenschaftenseiten für das Projekt, und legen Sie auf der Seite "Allgemeine Einstellungen" die Eigenschaft "Zielname " auf PSFLauncher32 oder PSFLauncher64 abhängig von der Architektur Ihrer Anwendung fest.

Fügen Sie einen Projektverweis zum Laufzeitkorrekturprojekt in Ihrer Projektmappe hinzu.

Klicken Sie mit der rechten Maustaste auf den Verweis, und wenden Sie dann im Eigenschaftenfenster diese Werte an.

Eigenschaft Wert
Lokal kopieren True
Lokale Satellitenassemblys kopieren True
Verweisassemblyausgabe True
Bibliothekabhängigkeiten verknüpfen False
Verknüpfungsbibliotheksabhängigkeitseingaben False

Schritt 5: Konfigurieren des Paketprojekts

Führen Sie die folgenden Schritte aus, um das Paketprojekt zu konfigurieren:

  1. Klicken Sie im Paketprojekt mit der rechten Maustaste auf den Ordner "Anwendungen ", und wählen Sie dann im Dropdownmenü "Verweis hinzufügen" aus.
  2. Wählen Sie das PSF-Startprogramm Projekt und Ihr Desktopanwendungsprojekt aus, und klicken Sie dann auf die Schaltfläche "OK".
  3. Wählen Sie sowohl das PSF-Startprogramm als auch das Desktopanwendungsprojekt aus, und klicken Sie dann auf die Schaltfläche "OK". Wenn der Anwendungsquellcode nicht verfügbar ist, wählen Sie nur das PSF-Startprogramm Projekt aus.
  4. Klicken Sie im Knoten "Anwendungen" mit der rechten Maustaste auf die PSF-Startprogramm Anwendung, und wählen Sie dann "Als Einstiegspunkt festlegen" aus.

Fügen Sie ihrem Paketprojekt eine Datei mit dem Namen config.json hinzu, kopieren Sie dann den folgenden JSON-Text, und fügen Sie ihn in die Datei ein. Legen Sie die Eigenschaft " Paketaktion " auf "Inhalt" fest.

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

Geben Sie einen Wert für jeden Schlüssel an. Verwenden Sie diese Tabelle als Richtlinie.

Array Schlüssel Wert
applications id Verwenden Sie den Wert des Attributs Id des Application Elements im Paketmanifest.
applications executable Der paketrelative Pfad zur ausführbaren Datei, die Sie starten möchten. In den meisten Fällen können Sie diesen Wert aus der Paketmanifestdatei abrufen, bevor Sie ihn ändern. Es ist der Wert des Executable Attributs des Application Elements.
applications workingDirectory (Optional) Ein paketrelativer Pfad, der als Arbeitsverzeichnis der Anwendung verwendet werden soll, die gestartet wird. Wenn Sie diesen Wert nicht festlegen, verwendet das Betriebssystem das System32 Verzeichnis als Arbeitsverzeichnis der Anwendung.
vorgänge executable In den meisten Fällen ist dies der Name des executable oben konfigurierten Pfads und der Dateierweiterung entfernt.
Fixups dll Paketrelativer Pfad zur zu ladenden Fixup-DLL.
Fixups config (Optional) Steuert, wie sich die Fixup-DLL verhält. Das genaue Format dieses Werts variiert je nach Fixupbasis, da jedes Fixup dieses "Blob" wie er möchte interpretieren kann.

Wenn Sie fertig sind, sieht ihre config.json Datei ungefähr wie folgt aus.

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

Hinweis

Die applications, processesund fixups die Schlüssel sind Arrays. Dies bedeutet, dass Sie die Datei config.json verwenden können, um mehrere Anwendungen, Prozesse und Fixup-DLL anzugeben.

Debuggen eines Laufzeitfixes

Drücken Sie in Visual Studio F5, um den Debugger zu starten. Das erste, was gestartet wird, ist die PSF-Startprogramm-Anwendung, die wiederum die Zieldesktopanwendung startet. Um die Zieldesktopanwendung zu debuggen, müssen Sie den Desktopanwendungsprozess manuell anfügen, indem Sie "Debuggen> an Prozess anfügen" auswählen und dann den Anwendungsprozess auswählen. Um das Debuggen einer .NET-Anwendung mit einer systemeigenen Laufzeit-Fix-DLL zuzulassen, wählen Sie verwaltete und systemeigene Codetypen (Mixed Mode Debugging) aus.

Sie können Haltepunkte neben Codezeilen im Desktopanwendungscode und dem Laufzeitkorrekturprojekt festlegen. Wenn Sie nicht über den Quellcode für Ihre Anwendung verfügen, können Sie Haltepunkte nur neben Codezeilen in Ihrem Laufzeitkorrekturprojekt festlegen.