Freigeben über


Erste Schritte mit dem Paketsupportframework

Das Paketunterstützungsframework ist ein Open Source Kit, das Ihnen hilft, Korrekturen auf Ihre vorhandene Desktopanwendung anzuwenden (ohne den Code zu ändern), damit es in einem MSIX-Container ausgeführt werden kann. Das Paketunterstützungsframework hilft Ihrer Anwendung dabei, die bewährten Methoden der modernen Laufzeitumgebung zu befolgen.

Dieser Artikel enthält eine ausführliche Übersicht über die einzelnen Komponenten des Paketsupportframeworks und schrittweise Anleitungen zur Verwendung.

Verstehen, was in einem Paketunterstützungsframework enthalten ist

Das Paketunterstützungs-Framework enthält eine ausführbare Datei, eine Laufzeit-Manager-DLL und eine Reihe von Laufzeitkorrekturen.

Paketunterstützungsframework

Hier ist der Prozess:

  1. Erstellen Sie eine Konfigurationsdatei, die die Korrekturen angibt, die Sie auf Ihre Anwendung anwenden möchten.
  2. Ändern Sie das Paket so, dass es auf die ausführbare Datei des Paketsupportframeworks (PSF)-Startprogramms verweist.

Wenn Benutzer Ihre Anwendung starten, ist das Paketunterstützungsframework-Startprogramm die erste ausführbare Datei, die ausgeführt wird. Sie liest Ihre Konfigurationsdatei und fügt die Laufzeitfixes und die Laufzeit-Manager-DLL in den Anwendungsprozess ein. Der Laufzeit-Manager wendet den Fix an, wenn er von der Anwendung benötigt wird, um innerhalb eines MSIX-Containers ausgeführt zu werden.

Paketunterstützung Framework-DLL-Einfügung

Schritt 1: Identifizieren von Kompatibilitätsproblemen mit verpackten Anwendungen

Erstellen Sie zunächst ein Paket für Ihre Anwendung. Installieren Sie sie dann, führen Sie sie aus, und beobachten Sie das Verhalten. Möglicherweise erhalten Sie Fehlermeldungen, die Ihnen beim Identifizieren eines Kompatibilitätsproblems helfen können. Sie können auch den Prozessmonitor verwenden, um Probleme zu identifizieren. Häufige Probleme beziehen sich auf Anwendungsannahmen hinsichtlich der Arbeitsverzeichnis- und Programmpfadberechtigungen.

Verwenden des Prozessmonitors zum Identifizieren eines Problems

Process Monitor ist ein leistungsstarkes Hilfsprogramm zum Beobachten der Datei- und Registrierungsvorgänge einer App und deren Ergebnisse. Dies kann Ihnen helfen, Anwendungskompatibilitätsprobleme zu verstehen. Fügen Sie nach dem Öffnen des Prozessmonitors einen Filter (Filterfilter > ...) hinzu, um nur Ereignisse aus der ausführbaren Anwendung einzuschließen.

ProcMon-App-Filter

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

ProcMon-Ereignisse

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

ProcMon-Erfolg ausschließen

Wenn Sie vermuten, dass ein Dateisystemzugriffsfehler auftritt, suchen Sie nach fehlgeschlagenen Ereignissen, die sich entweder unter System32/SysWOW64 oder dem Paketdateipfad befinden. Filter können auch hier hilfreich sein. Beginnen Sie am Ende dieser Liste, und scrollen Sie nach oben. Fehler, die am Ende dieser Liste angezeigt werden, sind zuletzt aufgetreten. Achten Sie am meisten 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 diesem Bild 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 versucht es, mithilfe eines relativen Pfads aus dieser Datei zu lesen, und standardmäßig ist "System32/SysWOW64" das Arbeitsverzeichnis der Anwendung. Dies deutet darauf hin, dass die Anwendung erwartet, dass das aktuelle Arbeitsverzeichnis an einer beliebigen Stelle im Paket festgelegt wird. Beim Blick in die appx-Datei können wir sehen, dass die Datei im selben Verzeichnis wie die ausführbare Datei vorhanden ist.

App-Config.txt

Das zweite Problem wird in der folgenden Abbildung angezeigt.

ProcMon Logfile

In diesem Problem kann die Anwendung keine .log Datei in den Paketpfad schreiben. Dies könnte darauf hindeuten, dass eine Korrektur der Dateiumleitung hilfreich sein könnte.

Schritt 2: Suchen eines Laufzeitfixes

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

Dateiumleitungskorrektur

Sie können die Dateiumleitungskorrektur verwenden, um Versuche zum Schreiben oder Lesen von Daten in einem Verzeichnis umzuleiten, auf das nicht über eine Anwendung zugegriffen werden kann, die in einem MSIX-Container ausgeführt wird.

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

Laufzeitfehlerbehebungen aus der Community

Überprüfen Sie unbedingt die Communitybeiträge zu unserer GitHub-Seite . Es ist möglich, dass andere Entwickler ein Problem behoben haben, das Ihren ähnelt und einen Laufzeit-Fix freigegeben hat.

Schritt 3: Anwenden eines Laufzeitfixes

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

  • Erstellen eines Paketlayoutordners
  • Abrufen der Paketsupportframework-Dateien
  • Hinzufügen zu Ihrem Paket
  • Ändern des Paketmanifests
  • Erstellen einer Konfigurationsdatei

Lassen Sie uns jede Aufgabe durchgehen.

Erstellen des Paketlayoutordners

Wenn Sie bereits über eine MSIX-Datei (oder .appx) verfügen, können Sie den 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 ausführen. Hier finden Sie das makeappx.exe Tool auf Ihrem Windows 10-PC: x86: C:\Program Files (x86)\Windows Kits\10\bin\x86\makeappx.exe x64: C:\Program Files (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) verfügen, mit der Sie beginnen möchten, können Sie den Paketordner und die Dateien von Grund auf neu erstellen.

Abrufen der Paketsupportframework-Dateien

Sie können das PSF Nuget-Paket über das eigenständige Nuget-Befehlszeilentool oder über Visual Studio abrufen.

Abrufen des Pakets mithilfe des Befehlszeilentools

Installieren Sie das Befehlszeilentool NuGet von diesem Ort: 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 in .zip umbenennen und entpacken. Alle benötigten Dateien befinden sich im Ordner "/bin".

Paket mit Visual Studio abrufen

Klicken Sie in Visual Studio mit der rechten Maustaste auf Ihren 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 Nuget.org zu finden. Installieren Sie sie dann.

Hinzufügen der Paket-Support-Framework-Dateien zu Ihrem Paket

Fügen Sie die erforderlichen 32-Bit- und 64-Bit-PSF-DLLs und ausführbaren Dateien zum Paketverzeichnis hinzu. Verwenden Sie die folgende Tabelle als Anleitung. Außerdem sollten Sie alle benötigten Laufzeitkorrekturen einschließen. In unserem Beispiel benötigen wir den Runtime-Fix für die Dateiumleitung.

Die ausführbare Anwendung ist 64-Bit. Ausführbare Anwendung ist x86
PSFLauncher64.exe PSFLauncher32.exe
PSFRuntime64.dll PSFRuntime32.dll
PSFRunDll64.exe PSFRunDll32.exe

Ihr Paketinhalt sollte nun etwa wie folgt aussehen.

Paketbinärdateien

Ändern des Paketmanifests

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

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

Erstellen einer Konfigurationsdatei

Erstellen Sie einen Dateinamen config.json, und speichern Sie diese Datei im Stammordner Ihres Pakets. Ändern Sie die deklarierte App-ID der config.json Datei so, dass sie auf die ausführbare Datei verweist, die Sie soeben ersetzt haben. Mit dem Wissen, das Sie über die Verwendung von Process Monitor gewonnen haben, können Sie auch das Arbeitsverzeichnis festlegen und die Dateiumleitungskorrektur verwenden, um Lese-/Schreibvorgänge an .log Dateien unter dem paketrelativen "PSFSampleApp"-Verzeichnis 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 ein Leitfaden für das config.json-Schema:

Anordnung Schlüssel Wert
Anwendungen id Verwenden Sie den Wert des Attributs Id des Application Elements im Paketmanifest.
Anwendungen ausführbare Datei 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.
Anwendungen 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.
Abläufe ausführbare Datei In den meisten Fällen ist dies der Name des oben konfigurierten executable, wobei der Pfad und die Dateierweiterung entfernt wurden.
Fixups DLL Paketrelativer Pfad zum Fixup, MSIX/.appx zum Laden.
Fixups Konfiguration (Optional) Steuert, wie sich die Fixup-DLL verhält. Das genaue Format dieses Werts variiert von Fixup zu Fixup, da jedes Fixup diesen "Blob" interpretieren kann, wie es möchte.

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

Packen und Testen der App

Erstellen Sie als Nächstes ein Paket.

makeappx pack /d PackageContents /p PSFSamplePackageFixup.msix

Signieren Sie es dann.

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

Weitere Informationen finden Sie unter Erstellen eines Paketsignaturzertifikats und zum 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 Verpackungsschritte nach Bedarf.

Prüfen Sie, ob das Paketunterstützungsframework ausgeführt wird

Sie können überprüfen, ob der Laufzeit-Fix ausgeführt wird. Eine Möglichkeit hierzu besteht darin, den 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 in der Lage sein zu sehen, dass das Paketunterstützungsframework ausgeführt wird.

Verwenden Sie die Ablaufverfolgungskorrektur

Eine alternative Methode zur Diagnose von Kompatibilitätsproblemen in verpackten Anwendungen besteht darin, den Trace Fixup zu verwenden. Diese DLL ist in der PSF enthalten und bietet eine detaillierte Diagnoseansicht des App-Verhaltens, ähnlich dem Prozessmonitor. Es ist speziell darauf ausgelegt, Anwendungskompatibilitätsprobleme aufzudecken. Um den Trace Fixup zu verwenden, fügen Sie die DLL zum Paket hinzu, fügen Sie dem config.jsondas folgende Fragment hinzu, und packen und installieren Sie die Anwendung.

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

Standardmäßig filtert Trace Fixup Fehler heraus, die möglicherweise als "erwartet" betrachtet werden können. Beispielsweise können Anwendungen versuchen, eine Datei bedingungslos zu löschen, ohne zu überprüfen, ob sie bereits vorhanden ist, ohne das Ergebnis zu ignorieren. Dies hat die unglückliche Folge, dass einige unerwartete Fehler möglicherweise herausgefiltert werden, daher entscheiden wir uns im obigen Beispiel dafür, alle Fehler von Dateisystemfunktionen zu erhalten. Dies geschieht, da wir 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 angenommen wird. In der Praxis ist es wahrscheinlich am besten, nur nach unerwarteten Fehlern zu filtern, und dann auf alle Fehler zurückfallen, wenn ein Problem auftritt, das immer noch nicht identifiziert werden kann.

Standardmäßig wird die Ausgabe des Trace Fixups an den angefügten Debugger gesendet. In diesem Beispiel werden wir keinen Debugger anfügen und verwenden stattdessen das DebugView-Programm von SysInternals, um die Ausgabe anzuzeigen. Nach dem Ausführen der App können dieselben Fehler wie zuvor angezeigt werden, was uns auf die gleichen Laufzeitfixes verweist.

TraceShim-Datei nicht gefunden

TraceShim-Zugriff verweigert

Debuggen, Erweitern oder Erstellen eines Laufzeitfixes

Sie können Visual Studio verwenden, um einen Runtime-Fix zu debuggen, einen Laufzeitfix zu erweitern oder von Grund auf neu zu erstellen. Sie müssen diese Dinge tun, um erfolgreich zu sein.

  • Hinzufügen eines Verpackungsprojekts
  • Hinzufügen eines Projekts für den Laufzeitfix
  • Fügen Sie ein Projekt hinzu, das die PSF-Launcher-Exe startet.
  • Konfigurieren des Verpackungsprojekts

Wenn Sie fertig sind, sieht Ihre Lösung ungefähr wie folgt aus.

Fertige Lösung

Sehen wir uns jedes Projekt in diesem Beispiel an.

Projekt Zweck
Desktop-Anwendungspaket Dieses Projekt basiert auf dem Windows Application Packaging-Projekt und gibt das MSIX-Paket aus.
Runtimefix Dies ist ein C++-Dynamic-Linked Bibliotheksprojekt, das mindestens eine Ersetzungsfunktion enthält, die als Laufzeitkorrektur dienen.
PSFLauncher Dies ist ein leeres C++-Projekt. Dieses Projekt ist ein Ort zum Sammeln der laufzeitverteilbaren Dateien des Paketsupportframeworks. Sie gibt eine ausführbare Datei aus. Diese ausführbare Datei ist das erste, was beim Starten der Lösung ausgeführt wird.
WinFormsDesktopApplication Dieses Projekt enthält den Quellcode einer Desktopanwendung.

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

Sehen wir uns die Schritte zum Erstellen und Konfigurieren der einzelnen Projekte in Ihrer Lösung an.

Erstellen einer Paketlösung

Wenn Sie noch keine Lösung für Ihre Desktopanwendung haben, erstellen Sie eine neue leere Projektmappe in Visual Studio.

Leere Lösung

Sie können auch beliebige Anwendungsprojekte hinzufügen, die Sie haben.

Hinzufügen eines Verpackungsprojekts

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.

Paketprojektvorlage

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

Klicken Sie im 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 den Laufzeitfix

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

Laufzeitkorrekturbibliothek

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

Suchen Sie auf den Eigenschaftenseiten das Feld "C++-Sprachstandard ", 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" festgelegt ist.

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

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

Nuget-Paket

Wenn Sie einen vorhandenen Laufzeitfix debuggen oder erweitern möchten, fügen Sie die Laufzeit-Fixdateien hinzu, die Sie mithilfe der im Abschnitt "Suchen einer Laufzeitkorrektur " dieses Handbuchs beschriebenen Anleitungen erhalten haben.

Wenn Sie einen völlig neuen Fix erstellen möchten, fügen Sie diesem Projekt noch nichts hinzu. Wir helfen Ihnen, die richtigen Dateien zu diesem Projekt weiter unten in diesem Leitfaden hinzuzufügen. Wir werden jetzt Ihre Lösung weiter einrichten.

Fügen Sie ein Projekt hinzu, das die PSF-Launcher-Exe startet.

Fügen Sie der Projektmappe ein C++-Empty Project-Projekt hinzu.

Leeres Projekt

Fügen Sie das PSF Nuget-Paket zu diesem Projekt hinzu, indem Sie die im vorherigen Abschnitt beschriebenen Anleitungen verwenden.

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

PSF Launcher-Referenz

Fügen Sie einen Projektverweis zum Laufzeitkorrekturprojekt in Ihrer Lösung hinzu.

Referenz zu Laufzeitkorrekturen

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

Eigentum Wert
Lokal kopieren Richtig
Lokale Satellitenassemblys kopieren Richtig
Referenzassemblyausgabe Richtig
Verknüpfungsbibliotheksabhängigkeiten Falsch
Eingaben für Bibliotheksabhängigkeit verknüpfen Falsch

Konfigurieren des Verpackungsprojekts

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

Projektreferenz hinzufügen

Wählen Sie das PSF-Startprogrammprojekt und das 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-Startprogrammprojekt aus. Wir zeigen Ihnen, wie Sie beim Erstellen einer Konfigurationsdatei auf Ihre ausführbare Datei verweisen.

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

Festlegen des Einstiegspunkts

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.

Anordnung Schlüssel Wert
Anwendungen id Verwenden Sie den Wert des Attributs Id des Application Elements im Paketmanifest.
Anwendungen ausführbare Datei 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.
Anwendungen 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.
Abläufe ausführbare Datei In den meisten Fällen ist dies der Name des oben konfigurierten executable, wobei der Pfad und die Dateierweiterung entfernt wurden.
Fixups DLL Paketrelativer Pfad zur zu ladenden Fixup-DLL.
Fixups Konfiguration (Optional) Steuert, wie sich die Fixup-DLL verhält. Das genaue Format dieses Werts variiert von Fixup zu Fixup, da jedes Fixup diesen "Blob" interpretieren kann, wie es möchte.

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, processes und fixups Schlüssel sind Arrays. Dies bedeutet, dass Sie die config.json Datei 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-Launcher-Anwendung, die wiederum Ihre 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.

Nachdem Sie dies eingerichtet haben, können Sie 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.

Da das F5-Debuggen die Anwendung ausführt, indem lose Dateien aus dem Pfad des Paketlayoutordners bereitgestellt werden, anstatt aus einem MSIX/.appx-Paket zu installieren, verfügt der Layoutordner in der Regel nicht über dieselben Sicherheitseinschränkungen wie ein installierter Paketordner. Daher ist es möglicherweise nicht möglich, Fehler bei der Zugriffsverweigerung auf den Paketpfad zu reproduzieren, bevor ein Laufzeitfix angewendet wird.

Um dieses Problem zu beheben, verwenden Sie die .msix / .appx-Paketbereitstellung statt der F5-los-Dateibereitstellung. Um eine MSIX/.appx Paketdatei zu erstellen, verwenden Sie das MakeAppx-Hilfsprogramm aus dem Windows SDK, wie oben beschrieben. Oder klicken Sie in Visual Studio mit der rechten Maustaste auf ihren Anwendungsprojektknoten, und wählen Sie "Store "> – App-Pakete erstellen" aus.

Ein weiteres Problem mit Visual Studio besteht darin, dass es keine integrierte Unterstützung für das Anhängen an Child-Prozesse hat, die vom Debugger gestartet werden. Dadurch ist es schwierig, logik im Startpfad der Zielanwendung zu debuggen, die nach dem Start manuell von Visual Studio angefügt werden muss.

Um dieses Problem zu beheben, verwenden Sie einen Debugger, der die Anbindung von untergeordneten Prozessen unterstützt. Beachten Sie, dass es im Allgemeinen nicht möglich ist, einen JIT-Debugger (Just-in-Time) an die Zielanwendung anzufügen. Dies liegt daran, dass die meisten JIT-Techniken das Starten des Debuggers anstelle der Ziel-App über den ImageFileExecutionOptions-Registrierungsschlüssel umfassen. Dadurch wird der Umwegmechanismus, der von PSFLauncher.exe verwendet wird, um FixupRuntime.dll in die Ziel-App einzufügen, besiegt. WinDbg, das in den Debugging-Tools für Windows enthalten ist und aus dem Windows SDK abgerufen wurde, unterstützt das Anfügen eines untergeordneten Prozesses. Sie unterstützt jetzt auch das direkte Starten und Debuggen einer UWP-App.

Um den Start der Zielanwendung als untergeordneter Prozess zu debuggen, starten Sie WinDbg.

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

Aktivieren Sie an der WinDbg-Eingabeaufforderung das Kind-Debugging und legen Sie entsprechende Haltepunkte fest.

.childdbg 1
g

(ausführen, bis die Zielanwendung gestartet wird und in den Debugger wechselt)

sxe ld fixup.dll
g

(ausführen, bis die Fixup-DLL geladen wird)

bp ...

Hinweis

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

Unterstützung

Haben Sie Fragen? Fragen Sie uns im Diskussionsbereich des Paketsupportframeworks auf der MSIX Tech Community-Website.