在 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 Desktop - > Dynamic-Link Library (DLL) 專案新增至方案。

接下來,以滑鼠右鍵按一下該專案,然後選擇 [ 屬性]。

在屬性頁面中,找出 [組態屬性 - > C/C++ - 語言 - >> C++ 語言標準] 欄位。 然後,從下拉式功能表中選取 [ISO C++17 標準 (/std:c++17) 。

以滑鼠右鍵按一下專案,然後在操作功能表中,選擇 [ 管理 Nuget 套件 ] 選項。 確定 [ 套件來源 ] 選項已設定為 [全部 ] 或 [nuget.org]。

按一下該欄位旁的設定圖示。

搜尋 Nuget 套件中的 PSF,然後為此專案安裝 Microsoft.PackageSupportFramework

nuget 套件

步驟 4:新增啟動 PSF 啟動器可執行檔的專案

將新的 Visual C++ - > 一般 - > 空白專案 新增至方案。

請執行下列步驟:

  1. 以滑鼠右鍵按一下該專案,然後在操作功能表中,選擇 [ 管理 Nuget 套件 ] 選項。 確定 [ 套件來源 ] 選項已設定為 [全部 ] 或 [nuget.org]。
  2. 按一下該欄位旁的設定圖示。
  3. 搜尋 Nuget 套件中的 PSF,然後為此專案安裝 Microsoft.PackageSupportFramework。

開啟專案 的屬性頁面 ,然後在 [ 一般 設定] 頁面中,將 [目標名稱 ] 屬性設定為 PSFLauncher32PSFLauncher64 ,視應用程式的架構而定。

將專案參考新增至方案中的執行時間修正專案。

以滑鼠右鍵按一下參考,然後在 [ 屬性] 視窗中套用這些值。

屬性
複製本機 True
複製附屬組件到本機 True
參考組件輸出 True
連結程式庫相依性 False
程式庫相依性輸入 False

步驟 5:設定封裝專案

若要設定封裝專案,請執行下列步驟:

  1. 在封裝專案中,以滑鼠右鍵按一下 [ 應用程式 ] 資料夾,然後從下拉式功能表中選擇 [ 新增參考 ]。
  2. 選擇 PSF 啟動器專案和傳統型應用程式專案,然後選擇 [ 確定 ] 按鈕。
  3. 同時選取PSF 啟動器和桌面應用程式專案,然後按一下 [確定] 按鈕。 如果應用程式原始程式碼無法使用,請只選取 PSF 啟動器專案。
  4. 在 [ 應用程式 ] 節點中,以滑鼠右鍵按一下 PSF 啟動器應用程式,然後選擇 [ 設定為進入點]。

將名為 config.json 的檔案新增至封裝專案,然後將下列 json 文字複製並貼到檔案中。 將 [封裝動作] 屬性設定為 [內容]。

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

提供每個索引鍵的值。 請使用下表作為指南。

Array 索引鍵
應用程式所需 id Id使用封裝資訊清單中元素的 Application 屬性值。
應用程式所需 可執行檔 您要啟動之可執行檔的套件相對路徑。 在大部分情況下,您可以在修改之前,先從套件資訊清單檔取得此值。 它是 Executable 元素的 Application 屬性值。
應用程式所需 workingDirectory (選擇性) 要當做啟動之應用程式的工作目錄使用的套件相對路徑。 如果您未設定此值,作業系統會 System32 使用 目錄作為應用程式的工作目錄。
處理程序 可執行檔 在大部分情況下,這會是上述設定的名稱 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" } ]
    }
  ]
}

注意

applicationsprocessesfixups 索引鍵是陣列。 這表示您可以使用 config.json 檔案來指定多個應用程式、進程和修正 DLL。

偵錯執行時間修正

在 Visual Studio 中,按 F5 以啟動偵錯工具。 第一個啟動專案是 PSF 啟動器應用程式,接著會啟動您的目標桌面應用程式。 若要偵錯目標傳統型應用程式,您必須選擇 [偵錯 - > 附加至進程],然後選取應用程式進程,手動附加至傳統型應用程式進程。 若要允許使用原生執行時間修正 DLL 對 .NET 應用程式進行偵錯,請 (混合模式偵錯) 選取 Managed 和機器碼類型。

您可以在傳統型應用程式程式碼和執行時間修正專案中,設定程式程式碼旁的中斷點。 如果您沒有應用程式的原始程式碼,您就只能在執行時間修正專案中的程式程式碼旁設定中斷點。