Erste Schritte mit dem Paketunterstützungsframework

Das Package Support Framework ist ein Open Source-Kit, mit dem Sie Fehlerbehebungen auf Ihre vorhandene Desktopanwendung anwenden können (ohne den Code zu ändern), sodass sie in einem MSIX-Container ausgeführt werden kann. Durch das Package Support Framework können in Ihrer Anwendung die bewährten Methoden moderner Laufzeitumgebungen angewandt werden.

Dieser Artikel bietet einen genauen Überblick über die einzelnen Komponenten des Paketunterstützungsframework sowie eine Schritt-für-Schritt-Anleitung zur Verwendung.

Verstehen, was sich in einem Paketunterstützungsframework befindet

Das Package Support Framework umfasst eine ausführbare Datei, eine Runtime-Manager-DLL und eine Reihe von Runtimekorrekturen.

Framework zur Paketunterstützung (Package Support Framework, PSF)

Dies ist der Prozess:

  1. Erstellen Sie eine Konfigurationsdatei, die die Fehlerbehebungen angibt, die Sie auf Ihre Anwendung anwenden möchten.
  2. Ändern Sie Ihr Paket so, dass es auf die ausführbare Datei mit dem Startprogramm für das Paketunterstützungsframework (PSF) verweisen kann.

Wenn Benutzer Ihre Anwendung starten, ist das Paketunterstützungsframework-Startprogramm die erste ausführbare Datei, die ausgeführt wird. Ihre Konfigurationsdatei wird gelesen, und die Runtimekorrekturen und die Runtime-Manager-DLL werden in den Anwendungsprozess eingefügt. Der Runtime-Manager wendet die Korrektur an, wenn diese erforderlich ist, damit die Anwendung in einem MSIX-Container ausgeführt wird.

Package Support Framework – Einfügen der DLL

Schritt 1: Identifizieren von Kompatibilitätsproblemen bei gepackten Anwendungen

Erstellen Sie zunächst ein Paket für Ihre Anwendung. Installieren Sie sie dann, führen Sie sie aus, und beobachten Sie ihr Verhalten. Möglicherweise werden Fehlermeldungen angezeigt, anhand derer Sie ein Kompatibilitätsproblem bestimmen können. Zum Identifizieren von Problemen können Sie auch Process Monitor verwenden. Häufige Probleme beziehen sich auf Anwendungsannahmen in Bezug auf das Arbeitsverzeichnis und die Berechtigungen für Programmpfade.

Verwenden des Prozessmonitors zum Identifizieren eines Problems

Der Prozessmonitor ist ein leistungsstarkes Hilfsprogramm zum Beobachten der Datei- und Registrierungsvorgänge einer App sowie deren Ergebnisse. Dies kann Ihnen helfen, Probleme mit der Anwendungskompatibilität zu verstehen. Fügen Sie nach dem Öffnen des Prozessmonitors einen Filter (Filter > Filter...) hinzu, um nur Ereignisse aus der ausführbaren Anwendungsdatei ein include.

ProcMon-App-Filter

Eine Liste der Ereignisse wird angezeigt. Für viele dieser Ereignisse wird das Wort SUCCESS in der Spalte Ergebnis angezeigt.

ProcMon-Ereignisse

Optional können Sie Ereignisse filtern, um nur Fehler zu zeigen.

ProcMon Exclude Success

Wenn Sie einen Dateisystemzugriffsfehler vermuten, suchen Sie nach fehlgeschlagenen Ereignissen, die sich entweder unter system32/SysWOW64 oder im Paketdateipfad befinden. Filter können auch hier helfen. Beginnen Sie am Ende dieser Liste, und scrollen Sie nach oben. Fehler, die am Ende dieser Liste angezeigt werden, sind zuletzt aufgetreten. Achten Sie besonders auf Fehler, die Zeichenfolgen wie "Zugriff verweigert" und "Pfad/Name nicht gefunden" enthalten, und ignorieren Sie Dinge, die nicht verdächtig aussehen. Das PSFSample hat zwei Probleme. Sie können diese Probleme in der Liste sehen, die in der folgenden Abbildung angezeigt wird.

ProcMon-Config.txt

Im ersten Problem, das in dieser Abbildung angezeigt wird, kann die Anwendung nicht aus der Datei "Config.txt" lesen, die sich im Pfad "C:\Windows\SysWOW64" befindet. Es ist unwahrscheinlich, dass die Anwendung versucht, direkt auf diesen Pfad zu verweisen. Höchstwahrscheinlich wird versucht, aus dieser Datei mithilfe eines relativen Pfads zu lesen, und standardmäßig ist "System32/SysWOW64" das Arbeitsverzeichnis der Anwendung. Dies deutet darauf hin, dass die Anwendung erwartet, dass ihr aktuelles Arbeitsverzeichnis an einer stelle im Paket auf festgelegt ist. Wenn wir uns in appx befinden, sehen wir, dass die Datei im gleichen Verzeichnis wie die ausführbare Datei vorhanden ist.

AppConfig.txt

Das zweite Problem wird in der folgenden Abbildung angezeigt.

ProcMon-Protokolldatei

In diesem Problem kann die Anwendung keine LOG-Datei in ihren Paketpfad schreiben. Dies würde darauf hindeuten, dass eine Dateiumleitungskorrektur helfen könnte.

Schritt 2: Suchen einer Laufzeitkorrektur

Die PSF enthält Laufzeitkorrekturen, die Sie sofort verwenden können, z. B. die Dateiumleitungskorrektur.

Korrektur der Dateiumleitung

Sie können die Dateiumleitungskorrektur verwenden, um Versuche umzuleiten, Daten in einem Verzeichnis zu schreiben oder zu lesen, auf das von einer Anwendung, die in einem MSIX-Container ausgeführt wird, nicht zugegriffen werden kann.

Wenn Ihre Anwendung beispielsweise in eine Protokolldatei schreibt, die sich im gleichen Verzeichnis wie die ausführbare Datei Ihrer Anwendung befindet, können Sie die Dateiumleitungskorrektur verwenden, um diese Protokolldatei an einem anderen Speicherort zu erstellen, z. B. im lokalen App-Datenspeicher.

Laufzeitkorrekturen aus der Community

Überprüfen Sie unbedingt die Beiträge der Community zu GitHub Seite. Es ist möglich, dass andere Entwickler ein Problem wie Ihr Problem gelöst und eine Laufzeitkorrektur freigegeben haben.

Schritt 3: Anwenden einer Laufzeitkorrektur

Sie können eine vorhandene Laufzeitkorrektur mit einigen einfachen Tools aus dem Windows SDK anwenden und die folgenden Schritte ausführen.

  • Erstellen eines Paketlayoutordners
  • Herunterladen der Paketunterstützungsframework-Dateien
  • Fügen Sie sie Ihrem Paket hinzu.
  • Ändern des Paketmanifests
  • Erstellen einer Konfigurationsdatei

Lassen Sie uns die einzelnen Aufgaben durchgehen.

Erstellen des Paketlayoutordners

Wenn Sie bereits über eine MSIX-Datei (oder APPX-Datei) verfügen, können Sie deren Inhalt in einen Layoutordner entpacken, der als Stagingbereich für Ihr Paket dient. Sie können dies über eine Eingabeaufforderung mithilfe des MakeAppx-Tools basierend auf Ihrem Installationspfad des SDK tun. Hier finden Sie das makeappx.exe-Tool auf Ihrem Windows 10-PC: x86: C:\Programme (x86)\Windows Kits\10\bin\x86\makeappx.exe x64: C:\Programme (x86)\Windows Kits\10\bin\x64\makeappx.exe

makeappx unpack /p PSFSamplePackage_1.0.60.0_AnyCPU_Debug.msix /d PackageContents

Dadurch erhalten Sie etwas, das wie folgt aussieht.

Paketlayout

Wenn Sie nicht über eine MSIX-Datei (oder APPX-Datei) verfügen, können Sie den Paketordner und die Dateien von Grund auf neu erstellen.

Herunterladen der Paketunterstützungsframework-Dateien

Sie können das PSF-NuGet-Paket mithilfe des eigenständigen NuGet-Befehlszeilentools oder über Visual Studio.

Paket mithilfe des Befehlszeilentools

Installieren Sie das NuGet-Befehlszeilentool von diesem Speicherort aus: https://www.nuget.org/downloads . Führen Sie dann über die NuGet-Befehlszeile den folgenden Befehl aus:

nuget install Microsoft.PackageSupportFramework

Alternativ können Sie die Paketerweiterung umbenennen, .zip entzippen. Alle benötigten Dateien befinden sich im Ordner /bin.

Paket mithilfe von Visual Studio

Klicken Visual Studio mit der rechten Maustaste auf den Projektmappen- oder Projektknoten, und wählen Sie einen der Befehle NuGet-Pakete verwalten aus. Suchen Sie nach Microsoft.PackageSupportFramework oder PSF, um das Paket auf dem Nuget.org. Installieren Sie sie dann.

Hinzufügen der Paketunterstützungsframework-Dateien zu Ihrem Paket

Fügen Sie die erforderlichen 32-Bit- und 64-Bit-PSF-DLLs und ausführbaren Dateien zum Paketverzeichnis hinzu. Orientieren Sie sich an der folgenden Tabelle. Sie sollten auch alle benötigten Laufzeitkorrekturen verwenden. In unserem Beispiel benötigen wir die Laufzeitkorrektur für die Dateiumleitung.

Ausführbare Anwendung ist x64 Ausführbare Anwendung ist x86
PSFLauncher64.exe PSFLauncher32.exe
PSFRuntime64.dll PSFRuntime32.dll
PSFRunDll64.exe PSFRunDll32.exe

Ihr Paketinhalt sollte nun in etwa wie hier aussehen.

Paketbinärdateien

Ändern des Paketmanifests

Öffnen Sie das Paketmanifest in einem Text-Editor, und legen Sie dann das -Attribut des -Elements auf den Namen der Executable Application ausführbaren PSF Startprogramm datei fest. Wenn Sie die Architektur Ihrer Zielanwendung kennen, wählen Sie die entsprechende Version aus, PSFLauncher32.exe oder PSFLauncher64.exe. Wenn dies nicht der Fall ist, funktionieren PSFLauncher32.exe in allen Fällen. Hier sehen Sie ein Beispiel.

<Package ...>
  ...
  <Applications>
    <Application Id="PSFSample"
                 Executable="PSFLauncher32.exe"
                 EntryPoint="Windows.FullTrustApplication">
      ...
    </Application>
  </Applications>
</Package>

Erstellen einer Konfigurationsdatei

Erstellen Sie einen config.json Dateinamen, und speichern Sie diese Datei im Stammordner Ihres Pakets. Ändern Sie die deklarierte App-ID des config.jsin der Datei so, dass sie auf die ausführbare Datei verweist, die Sie gerade ersetzt haben. Mithilfe des Wissens, das Sie bei der Verwendung des Prozessmonitors gewonnen haben, können Sie auch das Arbeitsverzeichnis festlegen und das Fixup für die Dateiumleitung verwenden, um Lese-/Schreibvorgänge in LOG-Dateien im paketbezogenen Verzeichnis "PSFSampleApp" umzuleiten.

{
    "applications": [
        {
            "id": "PSFSample",
            "executable": "PSFSampleApp/PSFSample.exe",
            "workingDirectory": "PSFSampleApp/"
        }
    ],
    "processes": [
        {
            "executable": "PSFSample",
            "fixups": [
                {
                    "dll": "FileRedirectionFixup.dll",
                    "config": {
                        "redirectedPaths": {
                            "packageRelative": [
                                {
                                    "base": "PSFSampleApp/",
                                    "patterns": [
                                        ".*\\.log"
                                    ]
                                }
                            ]
                        }
                    }
                }
            ]
        }
    ]
}

Es folgt eine Anleitung für die config.jsim Schema:

Array key Wert
applications id Verwenden Sie den Wert des Id -Attributs des Application -Elements im Paketmanifest.
applications executable Der paketbezogene 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. Dies ist der Wert des Executable -Attributs des Application -Elements.
applications workingDirectory (Optional) Ein paketrelativer Pfad, der als Arbeitsverzeichnis der gestarteten Anwendung verwendet werden soll. Wenn Sie diesen Wert nicht festlegen, verwendet das Betriebssystem das System32 Verzeichnis als Arbeitsverzeichnis der Anwendung.
Prozesse executable In den meisten Fällen ist dies der Name der executable oben konfigurierten , wobei der Pfad und die Dateierweiterung entfernt wurden.
Fixups DLL-Datei Paketreleativer Pfad zum Fixup, .msix/.appx, der geladen werden soll.
Fixups config (Optional) Steuert das Verhalten der Fixup-DLL. Das genaue Format dieses Werts variiert auf fixup-by-fixup-Basis, da jedes Fixup dieses "Blob" wie gewünscht interpretieren kann.

Die applications processes Schlüssel , und sind fixups Arrays. Das bedeutet, dass Sie die config.jsin der Datei verwenden können, um mehrere Anwendungen, Prozesse und Fehlerbehebungs-DLLs anzugeben.

Packen und Testen der App

Erstellen Sie als Nächstes ein Paket.

makeappx pack /d PackageContents /p PSFSamplePackageFixup.msix

Signieren Sie es anschließend.

signtool sign /a /v /fd sha256 /f ExportedSigningCertificate.pfx PSFSamplePackageFixup.msix

Weitere Informationen finden Sie unter Erstellen eines Paketsignaturzertifikats und Signieren eines Pakets mit signtool.

Installieren Sie das Paket mithilfe von PowerShell.

Hinweis

Denken Sie daran, das Paket zuerst zu deinstallieren.

powershell Add-AppPackage .\PSFSamplePackageFixup.msix

Führen Sie die Anwendung aus, und beobachten Sie das Verhalten mit angewendeter Laufzeitkorrektur. Wiederholen Sie die Diagnose- und Paketierungsschritte nach Bedarf.

Überprüfen, ob das Paketunterstützungsframework ausgeführt wird

Sie können überprüfen, ob die Laufzeitkorrektur ausgeführt wird. Eine Möglichkeit dazu besteht darin, Task-Manager zu öffnen und auf Weitere Details zu klicken. Suchen Sie die App, auf die das Paketunterstützungsframework angewendet wurde, und erweitern Sie die App-Details, um weitere Details anzuzeigen. Sie sollten anzeigen können, dass das Paketunterstützungsframework ausgeführt wird.

Verwenden der Ablaufverfolgungskorrektur

Eine alternative Methode zur Diagnose von Problemen mit der Anwendungskompatibilität von Paketen ist die Verwendung der Ablaufverfolgungskorrektur. Diese DLL ist in der PSF enthalten und bietet eine detaillierte Diagnoseansicht des Verhaltens der App, ähnlich wie der Prozessmonitor. Es wurde speziell entwickelt, um Probleme mit der Anwendungskompatibilität aufzudecken. Um die Ablaufverfolgungskorrektur zu verwenden, fügen Sie die DLL dem Paket hinzu, fügen Sie das folgende Fragment ihrem config.jshinzu, und packen Und installieren Sie die Anwendung.

{
    "dll": "TraceFixup.dll",
    "config": {
        "traceLevels": {
            "filesystem": "allFailures"
        }
    }
}

Standardmäßig filtert die Ablaufverfolgungskorrektur Fehler heraus, die als "erwartet" angesehen werden können. Beispielsweise können Anwendungen versuchen, eine Datei bedingungslos zu löschen, ohne zu überprüfen, ob sie bereits vorhanden ist, wobei das Ergebnis ignoriert wird. Dies hat die leidere Folge, dass einige unerwartete Fehler herausgefiltert werden können. Daher entscheiden wir uns im obigen Beispiel dafür, alle Fehler von Dateisystemfunktionen zu empfangen. Wir tun dies, da wir von vorher wissen, dass der Versuch, aus der Config.txt Datei zu lesen, mit der Meldung "Datei nicht gefunden" fehlschlägt. Dies ist ein Fehler, der häufig beobachtet wird und in der Regel nicht als unerwartet betrachtet wird. In der Praxis ist es wahrscheinlich am besten, nur nach unerwarteten Fehlern zu filtern und dann auf alle Fehler zurückzugehen, wenn es ein Problem gibt, das immer noch nicht identifiziert werden kann.

Standardmäßig wird die Ausgabe der Ablaufverfolgungskorrektur an den angefügten Debugger gesendet. In diesem Beispiel fügen wir keinen Debugger an und verwenden stattdessen das DebugView-Programm von SysInternals, um dessen Ausgabe anzuzeigen. Nach dem Ausführen der App werden die gleichen Fehler wie zuvor angezeigt, die auf die gleichen Laufzeitkorrekturen verweisen würden.

TraceShim-Datei nicht gefunden

TraceShim Access Denied

Debuggen, Erweitern oder Erstellen einer Laufzeitkorrektur

Sie können Visual Studio verwenden, um eine Laufzeitkorrektur zu debuggen, eine Laufzeitkorrektur zu erweitern oder von Grund auf neu zu erstellen. Sie müssen diese Vorgänge durchführen, um erfolgreich zu sein.

  • Hinzufügen eines Paketprojekts
  • Hinzufügen eines Projekts für die Laufzeitkorrektur
  • Fügen Sie ein Projekt hinzu, das die ausführbare PSF-Startprogramm startet.
  • Konfigurieren des Paketprojekts

Wenn Sie fertig sind, sieht Ihre Lösung in etwa wie folgt aus.

Abgeschlossene Lösung

Sehen wir uns die einzelnen Projekte in diesem Beispiel an.

Project Zweck
DesktopApplicationPackage Dieses Projekt basiert auf dem Windows Application Packaging-Projekt und gibt das MSIX-Paket aus.
Runtimefix Dies ist ein C++-Dynamic-Linked Library-Projekt, das eine oder mehrere Ersetzungsfunktionen enthält, die als Laufzeitkorrektur dienen.
PSFLauncher Dies ist C++ Empty Project. Dieses Projekt ist ein Ort zum Sammeln der laufzeitverteilbaren Dateien des Paketunterstützungsframeworks. Es gibt eine ausführbare Datei aus. Diese ausführbare Datei wird zuerst ausgeführt, wenn Sie die Projektmappe starten.
WinFormsDesktopApplication Dieses Projekt enthält den Quellcode einer Desktopanwendung.

Ein vollständiges Beispiel, das alle diese Projekttypen enthält, finden Sie unter PSFSample.

Im Folgenden werden die Schritte zum Erstellen und Konfigurieren dieser Projekte in Ihrer Projektmappe beschrieben.

Erstellen einer Paketlösung

Wenn Sie noch nicht über eine Lösung für Ihre Desktopanwendung verfügen, erstellen Sie in Visual Studio eine neue leere Projektmappe.

Leere Lösung

Sie können auch alle Anwendungsprojekte hinzufügen, über die Sie verfügen.

Hinzufügen eines Paketprojekts

Wenn Sie noch nicht über eine Windows Anwendungspaketerstellung Project verfügen, erstellen Sie eine, und fügen Sie sie Ihrer Lösung hinzu.

Paketprojektvorlage

Weitere Informationen zu Windows Anwendungspaketierungsprojekt 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 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)'=='<your runtime fix project name goes here>'" />
  </FilteredNonWapProjProjectOutput>
  <_FilteredNonWapProjProjectOutput Remove="@(_FilteredNonWapProjProjectOutput)" />
  <_FilteredNonWapProjProjectOutput Include="@(FilteredNonWapProjProjectOutput)" />
</ItemGroup>
</Target>

Hinzufügen eines Projekts für die Laufzeitkorrektur

Fügen Sie der Projektmappe ein C++-DLL-Projekt (Dynamic Link Library) hinzu.

Laufzeitkorrekturbibliothek

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

Suchen Sie auf den Eigenschaftenseiten nach dem Feld C++ Language Standard, und wählen Sie dann in der Dropdownliste neben diesem Feld die Option ISO C++17 Standard (/std:c++17) aus.

ISO 17-Option

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.

Klicken Sie auf das Einstellungssymbol neben diesem Feld.

Suchen Sie nach dem Paket PSF* Nuget, und installieren Sie es für dieses Projekt.

nuget-paket

Wenn Sie eine vorhandene Laufzeitkorrektur debuggen oder erweitern möchten, fügen Sie die Laufzeitkorrekturdateien hinzu, die Sie mithilfe der Anleitung erhalten haben, die im Abschnitt Suchen einer Laufzeitkorrektur dieses Handbuchs beschrieben ist.

Wenn Sie beabsichtigen, eine ganz neue Korrektur zu erstellen, fügen Sie diesem Projekt noch nichts hinzu. Wir helfen Ihnen, diesem Projekt später in diesem Leitfaden die richtigen Dateien hinzuzufügen. Vorerst setzen wir die Einrichtung Ihrer Lösung fort.

Hinzufügen eines Projekts, das die PSF-Datei Startprogramm startet

Fügen Sie der Projektmappe Project leere C++-Projektmappe hinzu.

Leeres Projekt

Fügen Sie diesem Projekt das PSF-NuGet-Paket hinzu, indem Sie die im vorherigen Abschnitt beschriebene Anleitung verwenden.

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

PSF Startprogramm Referenz

Fügen Sie dem Projekt zur Laufzeitkorrektur in Ihrer Projektmappe einen Projektverweis hinzu.

Referenz zur Laufzeitkorrektur

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

Eigenschaft Wert
Lokales Kopieren True
Lokale Satellitenassemblys kopieren True
Verweisassemblyausgabe True
Bibliothekabhängigkeiten verknüpfen False
Abhängigkeitseingaben der Linkbibliothek False

Konfigurieren des Paketprojekts

Klicken Sie im Paketprojekt mit der rechten Maustaste auf den Ordner Anwendungen, und wählen Sie dann Verweis hinzufügen aus.

Hinzufügen eines Projektverweises

Wählen Sie das PSF Startprogramm projekt und Ihr Desktopanwendungsprojekt aus, und klicken Sie dann auf die Schaltfläche OK.

Desktopprojekt

Hinweis

Wenn Sie nicht über den Quellcode für Ihre Anwendung verfügen, wählen Sie einfach das PSF-Startprogramm aus. Wir zeigen Ihnen, wie Sie auf Ihre ausführbare Datei verweisen, wenn Sie eine Konfigurationsdatei erstellen.

Klicken Sie im Knoten Anwendungen mit der rechten Maustaste auf die PSF-Startprogramm Anwendung, und wählen Sie dann Als Einstiegspunkt festlegen aus.

Festlegen als Einstiegspunkt

Fügen Sie ihrem Paketprojekt eine Datei mit dem Namen hinzu, kopieren Sie dann den folgenden JSON-Text, und fügen Sie ihn config.json 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 key Wert
applications id Verwenden Sie den Wert des Id -Attributs des Application -Elements im Paketmanifest.
applications executable Der paket relative Pfad zur ausführbaren Datei, die Sie starten möchten. In den meisten Fällen können Sie diesen Wert aus der Paketmanifestdatei erhalten, bevor Sie ihn ändern. Dies ist der Wert des Executable -Attributs des Application -Elements.
applications workingDirectory (Optional) Ein paket relativer Pfad, der als Arbeitsverzeichnis der anwendung verwendet werden soll, die gestartet wird. Wenn Sie diesen Wert nicht festlegen, verwendet das Betriebssystem das Verzeichnis System32 als Arbeitsverzeichnis der Anwendung.
Prozesse executable In den meisten Fällen ist dies der Name der oben konfigurierten , bei der der Pfad und die executable Dateierweiterung entfernt wurden.
Korrekturen DLL-Datei Paket relativer Pfad zur zu ladenden Fixup-DLL.
Korrekturen config (Optional) Steuert das Verhalten der Fixup-DLL. Das genaue Format dieses Werts variiert auf fixup-by-fixup-Basis, da jedes Fixup dieses "Blob" nach Be willen interpretieren kann.

Wenn Sie fertig sind, sieht config.json Ihre Datei in etwa wie hier aus.

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

Hinweis

Die applications Schlüssel , und sind processes fixups Arrays. Dies bedeutet, dass Sie die config.jsdatei verwenden können, um mehr als eine Anwendungs-, Prozess- und Fixup-DLL anzugeben.

Debuggen einer Laufzeitkorrektur

Drücken Visual Studio F5, um den Debugger zu starten. Der erste Schritt, der gestartet wird, ist die PSF Startprogramm anwendung, die wiederum Ihre Zieldesktopanwendung startet. Zum Debuggen der Zieldesktopanwendung müssen Sie manuell an den Desktopanwendungsprozess anfügen, indem Sie Debuggen-> An den Prozess anhängen auswählen und dann den Anwendungsprozess auswählen. Wählen Sie verwaltete und native Codetypen (Debuggen im gemischten Modus) aus, um das Debuggen einer .NET-Anwendung mit einer systemeigenen Laufzeitkorrektur-DLL zu ermöglichen.

Nachdem Sie dies eingerichtet haben, können Sie Haltepunkte neben Codezeilen im Desktopanwendungscode und im Projekt zur Laufzeitkorrektur festlegen. Wenn Sie nicht über den Quellcode für Ihre Anwendung verfügen, können Sie Haltepunkte nur neben Codezeilen in Ihrem Laufzeitkorrekturprojekt festlegen.

Da beim Debuggen von F5 die Anwendung ausgeführt wird, indem lose Dateien aus dem Ordnerpfad des Paketlayouts bereitgestellt werden, anstatt über ein .msix/.appx-Paket zu installieren, gelten für den Layoutordner in der Regel nicht die gleichen Sicherheitseinschränkungen wie für einen installierten Paketordner. Daher ist es möglicherweise nicht möglich, Fehler beim Zugriff auf den Paketpfad vor dem Anwenden einer Laufzeitkorrektur zu reproduzieren.

Um dieses Problem zu beheben, verwenden Sie die Paketbereitstellung .msix/.appx anstelle der F5-Loose-Dateibereitstellung. Um eine MSIX-/APPX-Paketdatei zu erstellen, verwenden Sie das Hilfsprogramm MakeAppx aus dem Windows SDK, wie oben beschrieben. Oder klicken Sie in Visual Studio mit der rechten Maustaste auf den Projektknoten Ihrer Anwendung, und wählen Sie Store -> App-Pakete erstellen aus.

Ein weiteres Problem bei Visual Studio besteht in der nicht integrierten Unterstützung für das Anfügen an untergeordnete Prozesse, die vom Debugger gestartet werden. Dies erschwert das Debuggen von Logik im Startpfad der Zielanwendung, die nach dem Start manuell von Visual Studio angefügt werden muss.

Verwenden Sie einen Debugger, der das Anfügen untergeordneter Prozesse unterstützt, um dieses Problem zu beheben. Beachten Sie, dass es in der Regel nicht möglich ist, einen JIT-Debugger (Just-In-Time) an die Zielanwendung anfügen. Dies liegt daran, dass die meisten JIT-Techniken das Starten des Debuggers statt der Ziel-App über den Registrierungsschlüssel ImageFileExecutionOptions beinhalten. Dies verfeinert den Umleitungsmechanismus, der von PSFLauncher.exe zum FixupRuntime.dll in die Ziel-App verwendet wird. WinDbg, das in den Debugtoolsfür Windows enthalten und aus dem Windows SDKerhalten wird, unterstützt das Anfügen untergeordneter Prozesse. Außerdem wird jetzt das direkte Starten und Debuggen einer UWP-App unterstützt.

Starten Sie , um den Start der Zielanwendung als untergeordneten Prozess zu WinDbg debuggen.

windbg.exe -plmPackage PSFSampleWithFixup_1.0.59.0_x86__7s220nvg1hg3m -plmApp PSFSample

Aktivieren Sie an WinDbg der Eingabeaufforderung untergeordnetes Debuggen, und legen Sie entsprechende Haltepunkte fest.

.childdbg 1
g

(Führen Sie aus, bis die Zielanwendung gestartet wird und in den Debugger einbricht)

sxe ld fixup.dll
g

(Ausführen bis zum Laden der Fixup-DLL)

bp ...

Hinweis

DEBUGDebug kann auch zum Anfügen eines Debuggers an eine App beim Start verwendet werden und ist auch in den Debugtools für Windows. Die Verwendung ist jedoch komplexer als die direkte Unterstützung, die jetzt von WinDbg bereitgestellt wird.

Support

Haben Sie Fragen? Fragen Sie uns im Konversationsraum des Paketunterstützungsframework auf der Tech Community-Website von MSIX.