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

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

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

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

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

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

Windows アプリケーション パッケージ プロジェクト をまだ持っていない場合は作成し、ソリューションに追加します。 新しい Visual C# > >Windows Universal > >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 Desktop >> Dynamic-Link Library (DLL) プロジェクトをソリューションに追加します。

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

プロパティ ページで、[構成プロパティ] > >[C/C++] > >[言語] > >[C++ 言語標準] フィールドを選択します。 次に、ドロップダウン メニューから [ISO C++17 Standard (/std:c++17)] を選択します。

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

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

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

nuget package

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

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

手順は次のとおりです。

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

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

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

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

プロパティ
ローカルにコピー True
ローカル サテライト アセンブリにコピー True
参照アセンブリの出力 True
ライブラリ依存関係のリンク False
ライブラリ依存関係のリンクの入力 False

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

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

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

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

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

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

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

完了すると、config.json ファイルは次のように表示されます。

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

Note

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

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

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

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