2

我有一个成熟的 wcf 应用程序,目前用 wix 打包,可以生成一个 msi。当 msi 安装在用户的电脑上时(使用 wix /msi gui 或使用带有 powershell 远程处理的 msiexec 自动化),它们会传入参数,例如保存到应用程序 app.config 文件中的应用程序后端 Web 服务的 URL。

我正在寻找用 MSIX 替换 wix 安装程序进程。此切换对我的主要好处是用户可以从 Web 服务器 URL 自己安装应用程序,而不必费心下载和运行 MSI。

为了实现简单的单击和安装过程并能够在不同的客户环境中暂存我的 MSIX,我需要在暂存应用程序时通过某种方式设置每个环境的应用程序后端 URL。鉴于 MSIX 是一个自容器包,其中所有文件都经过哈希处理和签名以确保它不会被篡改,有没有办法让我在暂存应用程序时发送不同的 URL,而无需在暂存时重新打包应用程序?

就上下文而言,该应用程序是我们为许多客户定制的产品,因此在内部我们有很多环境,我们经常使用自动化工具部署到其中,因此我希望避免在设置新环境时动态重新打包。

我基本上想发送配置,但不是在 msix 中。

4

2 回答 2

1

MSIX 改变了我们在安装时配置应用的方式。使用 MSIX 包,您无法再在安装期间捕获用户输入(应用配置),也无法执行任何自定义代码。这意味着您不再可以在安装时自定义任何内容。

正如您所说,在 MSIX 中交付的文件不能被篡改。实现此行为的唯一方法是在首次启动应用程序时检索并应用其他设置。

  1. 这可以手动完成,即您设计自定义对话框,您的用户只会在他们第一次启动应用程序时看到和填写。

  2. 或者您可以实现依赖于您的 AppInstaller 的 URL 的自动定制支持,即您的每个用户都必须收到不同的 AppInstaller 链接。当您的包安装在系统上时,它将缓存该链接,您可以使用预定义的 API 查询它,从而根据您阅读的链接在您的应用程序中实现自定义行为。

这个来自 MSIX 技术社区论坛的示例中,我包含了一个示例,该示例展示了如何使用 PowerShell 脚本将 AppInstaller URL 保存在注册表中。

现在,此示例依赖于Advanced Installer 的 Package Support Framework 集成。使用此方法,您可以获得更大的灵活性,因为您可以自定义 MSIX 包中包含的 PS 脚本,而无需更改应用程序的代码。您甚至可以扩展 PS 脚本以根据它读取的 URL 更新您的配置文件。

但是,您可以完全跳过使用包支持框架,只需在应用程序中添加保存 URL 的代码。然后使用下面的示例代码配置您的应用程序以在每次启动时检查此 URL,并根据它读取的 URL 更新您的配置文件。

显然,您的配置文件的默认版本需要包含一个唯一的占位符,这样如果占位符丢失,您可以跳过检查 AppInstaller URL(即您的应用根据检测到的 URL 将其替换为相应的配置)

[Windows.ApplicationModel.Package, indows.ApplicationModel,ContentType=WindowsRuntime]
$path = [Windows.ApplicationModel.Package]::Current.GetAppInstallerInfo().Uri.AbsolutePath

很重要!确保将配置文件保存在AppData文件夹中,而不是安装文件夹中(就像使用 MSI 时所做的那样)。如果您尝试写入安装文件夹中的任何文件,您的应用程序将失败。

对于 MSIX 包应用程序,AppData 的处理方式不同,您可以在此处阅读更多信息:

于 2020-10-05T16:16:37.327 回答
0

你看过修改包吗?

这些有点类似于 MSI 转换文件,但可以在 MSIX 文件之后安装(如插件或 DLC 包)。它们基本上允许您添加或覆盖原始包的虚拟文件系统中的文件。您的应用可以读取存储 URL 的配置文件,而该配置文件又可以通过安装修改包进行修改,而无需接触原始 MSIX 包。

于 2020-10-06T10:33:01.857 回答