在 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 。
步驟 4:新增啟動 PSF 啟動器可執行檔的專案
將新的 Visual C++ - > 一般 - > 空白專案 新增至方案。
請執行下列步驟:
- 以滑鼠右鍵按一下該專案,然後在操作功能表中,選擇 [ 管理 Nuget 套件 ] 選項。 確定 [ 套件來源 ] 選項已設定為 [全部 ] 或 [nuget.org]。
- 按一下該欄位旁的設定圖示。
- 搜尋 Nuget 套件中的 PSF,然後為此專案安裝 Microsoft.PackageSupportFramework。
開啟專案 的屬性頁面 ,然後在 [ 一般 設定] 頁面中,將 [目標名稱 ] 屬性設定為 PSFLauncher32
或 PSFLauncher64
,視應用程式的架構而定。
將專案參考新增至方案中的執行時間修正專案。
以滑鼠右鍵按一下參考,然後在 [ 屬性] 視窗中套用這些值。
屬性 | 值 |
---|---|
複製本機 | True |
複製附屬組件到本機 | True |
參考組件輸出 | True |
連結程式庫相依性 | False |
程式庫相依性輸入 | False |
步驟 5:設定封裝專案
若要設定封裝專案,請執行下列步驟:
- 在封裝專案中,以滑鼠右鍵按一下 [ 應用程式 ] 資料夾,然後從下拉式功能表中選擇 [ 新增參考 ]。
- 選擇 PSF 啟動器專案和傳統型應用程式專案,然後選擇 [ 確定 ] 按鈕。
- 同時選取PSF 啟動器和桌面應用程式專案,然後按一下 [確定] 按鈕。 如果應用程式原始程式碼無法使用,請只選取 PSF 啟動器專案。
- 在 [ 應用程式 ] 節點中,以滑鼠右鍵按一下 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" } ]
}
]
}
注意
applications
、 processes
和 fixups
索引鍵是陣列。 這表示您可以使用 config.json 檔案來指定多個應用程式、進程和修正 DLL。
偵錯執行時間修正
在 Visual Studio 中,按 F5 以啟動偵錯工具。 第一個啟動專案是 PSF 啟動器應用程式,接著會啟動您的目標桌面應用程式。 若要偵錯目標傳統型應用程式,您必須選擇 [偵錯 - > 附加至進程],然後選取應用程式進程,手動附加至傳統型應用程式進程。 若要允許使用原生執行時間修正 DLL 對 .NET 應用程式進行偵錯,請 (混合模式偵錯) 選取 Managed 和機器碼類型。
您可以在傳統型應用程式程式碼和執行時間修正專案中,設定程式程式碼旁的中斷點。 如果您沒有應用程式的原始程式碼,您就只能在執行時間修正專案中的程式程式碼旁設定中斷點。