在 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) 项目添加到解决方案。

接下来,右键单击该项目,然后选择 “属性”。

在属性页中,找到 “配置属性 -> 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 取决于应用程序的体系结构。

在解决方案中添加对运行时修复项目的项目引用。

右键单击引用,然后在 “属性 ”窗口中应用这些值。

properties “值”
复制本地 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 key “值”
applications ID 使用包清单中元素的属性Application的值Id
applications 可执行文件 要启动的可执行文件的包相对路径。 在大多数情况下,可以在修改包清单文件之前从包清单文件中获取此值。 它是元素的属性Application的值Executable
applications 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 应用程序,请选择托管代码和本机代码类型, (混合模式调试) 。

可以在桌面应用程序代码和运行时修复项目的代码行旁边设置断点。 如果没有应用程序的源代码,则只能在运行时修复项目中的代码行旁边设置断点。