Visual Studio でパッケージ サポート フレームワークを適用する

パッケージ サポート フレームワーク (PSF) は、既存のデスクトップ アプリケーションに修正プログラムを適用できる オープン ソース プロジェクト です。 PSF を使用すると、コードを変更せずに、パッケージ形式でアプリケーションを実行できます。 パッケージ サポート フレームワークは、アプリケーションで最新のランタイム環境のベスト プラクティスに従うのに役立ちます。

以降のセクションでは、新しい Visual Studio プロジェクトを作成し、ソリューションにパッケージ サポート フレームワークを含め、ランタイム修正を作成する方法について説明します。

手順 1: Visual Studio でパッケージ ソリューションを作成する

Visual Studio で、新しい Visual Studio ソリューション、空のソリューションを作成します。 新しく作成された 空のソリューションにアプリケーション プロジェクトを追加します。

手順 2: パッケージ プロジェクトを追加する

Windows アプリケーション パッケージ プロジェクトがまだない場合は、プロジェクトを作成してソリューションに追加します。 新しい Visual C# -> Windows ユニバーサル -> Windows アプリケーション パッケージ プロジェクト を作成し、新しく作成したソリューションに追加します。

Windows アプリケーション パッケージ プロジェクトの詳細については、「 Visual Studio を使用してアプリケーションをパッケージ化する」を参照してください。

ソリューション エクスプローラーで、パッケージ プロジェクトを右クリックし、[プロジェクト ファイルの編集] を選択し、プロジェクト ファイルの下部に追加します。

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

手順 3: ランタイム修正プログラムのプロジェクトを追加する

新しい Visual C++ -> Windows デスクトップ -> Dynamic-Link ライブラリ (DLL) プロジェクトをソリューションに追加します。

次に、そのプロジェクトを右クリックし、[ プロパティ] を選択します。

プロパティ ページで、 Configuration Properties -> C/C++ -> Language -> C++ Language Standard フィールドを 見つけます。 次に、ドロップダウン メニューから ISO C++17 Standard (/std:c++17) を選択します。

プロジェクトを右クリックし、コンテキスト メニューの [ Nuget パッケージの管理 ] オプションを選択します。 [パッケージ ソース] オプションが [すべて] または [nuget.org] に設定されていることを確認します。

そのフィールドの横にある設定アイコンをクリックします。

Nuget パッケージで PSF を検索し、このプロジェクトの Microsoft.PackageSupportFramework をインストールします。

nuget パッケージ

手順 4: PSF Launcher 実行可能ファイルを起動するプロジェクトを追加する

新しい Visual C++ -> General -> Empty Project をソリューションに追加します。

次の手順を実行します。

  1. そのプロジェクトを右クリックし、コンテキスト メニューの [ Nuget パッケージの管理 ] オプションを選択します。 [パッケージ ソース] オプションが [すべて] または [nuget.org] に設定されていることを確認します。
  2. そのフィールドの横にある設定アイコンをクリックします。
  3. Nuget パッケージで PSF を検索し、このプロジェクトの Microsoft.PackageSupportFramework をインストールします。

プロジェクトの プロパティ ページ を開き、[ 全般 設定] ページで、アプリケーションのアーキテクチャに応じてターゲット プロパティを PSFLauncher32 または PSFLauncher64 に設定します。

ソリューション内のランタイム修正プロジェクトへのプロジェクト参照を追加します。

参照を右クリックし、[ プロパティ ] ウィンドウでこれらの値を適用します。

プロパティ 価値
ローカルにコピー 正しい
ローカル サテライト アセンブリをコピーする 正しい
参照アセンブリの出力 正しい
リンク ライブラリの依存関係 いいえ
リンク ライブラリの依存関係の入力 いいえ

手順 5: パッケージ 化プロジェクトを構成する

パッケージ プロジェクトを構成するには、次の手順を実行します。

  1. パッケージ 化プロジェクトで、[ アプリケーション ] フォルダーを右クリックし、ドロップダウン メニューから [ 参照の追加] を選択します。
  2. PSF ランチャー プロジェクトとデスクトップ アプリケーション プロジェクトを選択し、[ OK] ボタンを選択します。
  3. PSF ランチャーデスクトップ アプリケーション プロジェクトの両方を選択し、[OK] ボタンをクリックします。 アプリケーションのソース コードを使用できない場合は、PSF ランチャー プロジェクトのみを選択します。
  4. [アプリケーション] ノードで、PSF ランチャー アプリケーションを右クリックし、[エントリ ポイントとして設定] を選択します。

パッケージ プロジェクトに config.json という名前のファイルを追加し、次の json テキストをコピーしてファイルに貼り付けます。 [パッケージ アクション] プロパティを [コンテンツ] に設定します。

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

各キーの値を指定します。 次の表を参考にしてください。

配列 価値
アプリケーション 身分証明書 パッケージ マニフェストのId要素のApplication属性の値を使用します。
アプリケーション 実行可能ファイル 開始する実行可能ファイルへのパッケージ相対パス。 ほとんどの場合、変更する前にパッケージ マニフェスト ファイルからこの値を取得できます。 Executable要素のApplication属性の値です。
アプリケーション 作業ディレクトリ (workingDirectory) (省略可能)起動するアプリケーションの作業ディレクトリとして使用するパッケージ相対パス。 この値を設定しない場合、オペレーティング システムはアプリケーションの作業ディレクトリとして System32 ディレクトリを使用します。
プロセス 実行可能ファイル ほとんどの場合、パスとファイル拡張子を削除して上記で構成した executable の名前になります。
修正 dll 読み込む修正プログラムの DLL へのパッケージ相対パス。
修正 設定 (省略可能)修正 DLL の動作を制御します。 この値の正確な形式は、修正ごとに異なります。各修正では、この "BLOB" を必要に応じて解釈できるためです。

完了すると、 config.json ファイルは次のようになります。

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

applicationsprocesses、およびfixupsキーは配列です。 つまり、config.json ファイルを使用して、複数のアプリケーション、プロセス、および修正 DLL を指定できます。

ランタイム修正プログラムをデバッグする

Visual Studio で F5 キーを押してデバッガーを起動します。 最初に起動するのは PSF ランチャー アプリケーションで、ターゲット デスクトップ アプリケーションを起動します。 ターゲット デスクトップ アプリケーションをデバッグするには、 Debug->Attach to Process を選択し、アプリケーション プロセスを選択して、デスクトップ アプリケーション プロセスに手動でアタッチする必要があります。 ネイティブ ランタイム修正 DLL を使用した .NET アプリケーションのデバッグを許可するには、マネージド コードとネイティブ コードの種類 (混合モードデバッグ) を選択します。

デスクトップ アプリケーション コードとランタイム修正プロジェクトのコード行の横にブレークポイントを設定できます。 アプリケーションにソース コードがない場合は、ランタイム修正プロジェクトのコード行の横にのみブレークポイントを設定できます。