通过托管应用模型,可以创建从主机应用继承其可执行文件和入口点的轻型应用。 托管应用是一个单独的包,其中包含内容(脚本、资产、配置),但依赖于主机的运行时来执行。
托管应用的工作原理
主机应用在其清单中声明扩展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 值是托管应用用来声明其依赖项时所引用的值。
声明托管的应用
在托管应用的清单中,声明主机运行时依赖项,并指定 TrustLevel 和 RuntimeBehavior:
<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=""script.py"">
</Application>
</Applications>
</Package>
关键属性:
| Attribute | Description |
|---|---|
HostRuntimeDependency.Name |
主机应用的包系列名称 |
HostId |
匹配主机应用中的 HostRuntime.Id |
Parameters |
传递给主机可执行文件的命令行参数 |
创建托管的应用包
若要创建托管的应用包,请执行以下操作:
- 创建标准 MSIX 项目或使用
MakeAppx.exe。 - 仅包含您自己的内容相关文件(脚本、资源、配置)。
- 请勿包含可执行程序——该程序由主机提供。
- 在清单中声明
HostRuntimeDependency。 - 使用受信任的证书对包进行签名以供生产。 在开发过程中,可以以未签名方式注册该包(请参阅下文)。
未签名包注册(开发)
在开发过程中,可以注册未签名的托管应用包:
Add-AppxPackage -Path "HostedApp.msix" -AllowUnsigned
注释
未签名的包注册仅用于开发。 在生产环境中,请使用受信任的证书对该软件包进行签名。
示例:Python脚本主机
Python运行时应用可以充当主机:
-
主机应用 — 包
python.exe并声明HostRuntime Id="PythonHost"。 -
托管应用 — 包含一个 Python 脚本(
app.py),并使用Parameters="app.py"声明HostId="PythonHost"。 - 当用户启动托管应用时,Windows以托管应用的包目录作为工作上下文运行主机
python.exe app.py。