在 Visual Studio 中应用包支持框架

包支持框架 (PSF) 是一个开源项目,可用于将修补程序应用于现有桌面应用程序。 PSF 使应用程序能够在不修改代码的情况下以 MSIX 打包格式运行。 包支持框架可帮助应用程序遵循新式运行时环境的最佳做法。

以下部分将探讨如何创建新的 Visual Studio 项目,包括解决方案中的包支持框架和创建运行时修补程序。

步骤 1:在 Visual Studio

在Visual Studio中,新建一Visual Studio 解决方案,即"空白解决方案"。 将任何应用程序项目包括在新创建的空白 解决方案 中

步骤 2:添加打包项目

如果还没有应用程序打包Windows应用程序Project,请创建一个,并将其添加到解决方案。 创建新的 Visual C# -> Windows通用 -> Windows 应用程序打包Project 并将其添加到新创建的解决方案。

有关应用程序打包Windows,请参阅使用 应用程序打包Visual Studio。

解决方案资源管理器 中,右键单击打包项目,选择"编辑Project 文件", 然后将它添加到项目文件的底部:

...
  <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"。

单击该字段旁边的设置图标。

搜索 PSF 的 Nuget 包,然后安装此项目的 Microsoft.PackageSupportFramework。

NuGet 包

步骤 4:添加一个项目,该项目启动 PSF Launcher可执行文件

向解决方案 Visual C++ ->常规 ->空Project 新代码。

执行以下步骤:

  1. 右键单击该项目,然后在上下文菜单中选择"管理 Nuget 包" 选项。 确保"包源" 选项设置为"全部 " 或"nuget.org"。
  2. 单击该字段旁边的设置图标。
  3. 搜索 PSF 的 Nuget 包,然后安装此项目的 Microsoft.PackageSupportFramework。

打开 项目的属性 页,在"常规设置"页中,将"目标名称"属性设置为 或 PSFLauncher32 ,具体取决于 PSFLauncher64 应用程序的体系结构。

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

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

属性
复制本地 正确
复制本地附属程序集 正确
引用程序集输出 正确
链接库依赖项 错误
链接库依赖项输入 错误

步骤 5:配置打包项目

若要配置打包项目,请执行以下步骤:

  1. 在打包项目中,右键单击" 应用程序" 文件夹, 然后从下拉菜单 中选择"添加引用"。
  2. 选择 PSF Launcher和桌面应用程序项目,然后选择"确定 " 按钮。
  3. 同时选择 "PSF Launcher" 和"桌面应用程序" 项目,然后单击"确定"按钮。 如果应用程序源代码不可用,请仅选择 PSF Launcher项目。
  4. 在"应用程序" 节点中,右键单击 PSF Launcher应用程序,然后选择"设置为 入口点"。

将名为 的文件添加到打包项目,然后将以下 json 文本复制 config.json 并粘贴到文件中。 将"包操作" 属性设置为 "内容"。

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

提供每个键的值。 使用此表作为指南。

Array key
applications id 使用包清单中 Id Application 元素的 属性的值。
applications 可执行文件 要启动的可执行文件的包相对路径。 在大多数情况下,可以在修改包清单文件之前获取此值。 它是 元素 Executable 的 属性的值 Application
applications workingDirectory (可选) 用作启动的应用程序的工作目录的包相对路径。 如果未设置此值,操作系统将使用 目录作为 System32 应用程序的工作目录。
进程 可执行文件 在大多数情况下,这将是上面配置的 的名称,其中删除了 executable 路径和文件扩展名。
修复 dll 要加载的修复 DLL 的包相对路径。
修复 config (可选) 控制修复 DLL 的行为方式。 此值的确切格式因修复而异,因为每个修复都可以根据需要解释此"blob"。

完成后,文件 config.json 将如下所示。

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

备注

applications processesfixups 键是数组。 这意味着,可以使用 config.json 文件指定多个应用程序、进程和修复 DLL。

调试运行时修复

在Visual Studio,按 F5 启动调试器。 首先,PSF 应用程序Launcher启动目标桌面应用程序。 若要调试目标桌面应用程序,必须手动附加到桌面应用程序进程,方法为选择"调试>附加到进程", 然后选择应用程序进程。 若要允许使用本机运行时修复 DLL 调试 .NET 应用程序,请选择托管和本机代码类型 (混合模式调试) 。

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