在 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 package

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

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

執行下列步驟:

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

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

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

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

屬性
複製本機 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": {
                    }
                }
            ]
        }
    ]
}

為每個索引鍵提供值。 使用此表格做為指南。

陣列 索引鍵
應用程式 id 使用封裝指令清單中專案之 屬性Application的值Id
應用程式 可執行檔 您要啟動之可執行檔的套件相對路徑。 在大部分情況下,您可以在修改套件指令清單檔案之前,先從套件指令清單檔案取得此值。 它是 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 和原生程式代碼類型 (混合模式偵錯)。

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