Windows 应用 SDK 中的托管应用

通过托管应用模型,可以创建从主机应用继承其可执行文件和入口点的轻型应用。 托管应用是一个单独的包,其中包含内容(脚本、资产、配置),但依赖于主机的运行时来执行。

托管应用的工作原理

主机应用在其清单中声明扩展HostRuntime,使其可执行文件可用于其他包。 托管应用声明该主机的依赖项,并指定要运行的内容。 当用户启动托管应用时,Windows启动主机的可执行文件,并将托管应用的内容作为上下文传递。

此模型适用于:

  • 脚本引擎 - 主机提供运行时(例如,Python、Node.js),托管应用是单个脚本或应用程序。
  • 游戏引擎 - 主机提供游戏引擎,托管的应用是单个游戏。
  • 应用框架 - 主机提供框架运行时,托管应用是其上运行的内容。

Important

主机和托管应用都需要 MSIX 包标识。 托管应用是一个已签名的 MSIX 包,但其可执行文件由宿主应用提供。

声明主机运行时

在主机应用的 Package.appxmanifest 中,添加一个 HostRuntime 扩展:

<Package xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10" ...>
  <Applications>
    <Application Id="App" Executable="MyHost.exe" EntryPoint="...">
      <Extensions>
        <uap10:Extension Category="windows.hostRuntime">
          <uap10:HostRuntime Id="MyHostRuntime" />
        </uap10:Extension>
      </Extensions>
    </Application>
  </Applications>
</Package>

Id 值是托管应用用来声明其依赖项时所引用的值。

声明托管的应用

在托管应用的清单中,声明主机运行时依赖项,并指定 TrustLevelRuntimeBehavior

<Package xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10" ...>
  <Dependencies>
    <uap10:HostRuntimeDependency Name="HostAppPackageFamilyName"
                                  Publisher="CN=HostPublisher"
                                  MinVersion="1.0.0.0" />
  </Dependencies>
  <Applications>
    <Application Id="App"
                 uap10:HostId="MyHostRuntime"
                 uap10:Parameters="&quot;script.py&quot;">
    </Application>
  </Applications>
</Package>

关键属性:

Attribute Description
HostRuntimeDependency.Name 主机应用的包系列名称
HostId 匹配主机应用中的 HostRuntime.Id
Parameters 传递给主机可执行文件的命令行参数

创建托管的应用包

若要创建托管的应用包,请执行以下操作:

  1. 创建标准 MSIX 项目或使用 MakeAppx.exe
  2. 仅包含您自己的内容相关文件(脚本、资源、配置)。
  3. 请勿包含可执行程序——该程序由主机提供。
  4. 在清单中声明 HostRuntimeDependency
  5. 使用受信任的证书对包进行签名以供生产。 在开发过程中,可以以未签名方式注册该包(请参阅下文)。

未签名包注册(开发)

在开发过程中,可以注册未签名的托管应用包:

Add-AppxPackage -Path "HostedApp.msix" -AllowUnsigned

注释

未签名的包注册仅用于开发。 在生产环境中,请使用受信任的证书对该软件包进行签名。

示例:Python脚本主机

Python运行时应用可以充当主机:

  1. 主机应用 — 包 python.exe 并声明 HostRuntime Id="PythonHost"
  2. 托管应用 — 包含一个 Python 脚本(app.py),并使用 Parameters="app.py" 声明 HostId="PythonHost"
  3. 当用户启动托管应用时,Windows以托管应用的包目录作为工作上下文运行主机python.exe app.py