如何将配置设置注入到MSIX包中

3
我有一个成熟的wcf应用程序,目前是与wix一起打包生成msi文件。当用户在其计算机上安装msi时(使用wix / msi gui或使用powershell远程自动化执行msiexec),他们会传入参数,如应用程序背后的Web服务的URL,并保存到应用程序的app.config文件中。
我希望用MSIX替换wix安装程序过程。这种转换对我最大的好处是,用户可以从Web服务器URL自行安装应用程序,而不必下载和运行MSI。
为了实现简单的点击安装过程并能够在不同客户环境中设置我的MSIX,我需要找到一种方法,在我部署应用程序时为每个环境设置应用程序的后端URL。鉴于MSIX是一个自包含的软件包,其中所有文件都经过哈希处理和签名以确保不被篡改,那么在我部署应用程序时有没有办法在不重新打包应用程序的情况下提供不同的URL呢?
为了解释背景,该应用程序是我们为许多客户定制的产品,因此我们在不断部署各种环境,并使用自动化工具进行部署,因此我希望避免在设置新环境时必须重新打包。
基本上,我想要将配置与msix一起发送,而不是将其包含在msix内部。

你找到解决你问题的方法了吗?我们面临着一个非常类似的情况... - Mario Eis
2个回答

1

MSIX改变了我们在安装时配置应用程序的方式。使用MSIX包,您不能再在安装过程中捕获用户输入(应用程序配置),也不能执行任何自定义代码。这意味着您不再有在安装时自定义任何内容的选项。

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

  1. 可以通过手动方式完成此操作,即设计自定义对话框,用户只会在第一次启动应用程序时看到并填写。

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

在 MSIX techcommunity 论坛的 这个示例 中,我使用了 PowerShell 脚本,展示了如何将 AppInstaller URL 保存在注册表中

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

然而,您完全可以跳过使用 Package Support Framework,并简单地添加保存 URL 的代码到您的应用程序中。然后,使用下面的示例代码配置您的应用程序,在每次启动时检查此 URL,并根据它读取的 URL 更新您的配置文件。

显然,您的配置文件的默认版本需要包含一个唯一的占位符,这样如果缺少该占位符(即您的应用程序根据检测到的URL替换了相应的配置),则可以跳过检查AppInstaller URL。
[Windows.ApplicationModel.Package, indows.ApplicationModel,ContentType=WindowsRuntime]
$path = [Windows.ApplicationModel.Package]::Current.GetAppInstallerInfo().Uri.AbsolutePath
非常重要!请确保将配置文件保存在AppData文件夹中,而不是安装文件夹中(当使用MSI时可能会这样做)。如果尝试写入安装文件夹中的任何文件,则应用程序将失败。
对于MSIX包应用程序,AppData的处理方式有所不同,您可以在此处阅读更多:

0

你看过修改包了吗?

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


谢谢。我确实简要查看了一下,但我认为它们更多是用于通过插件架构扩展功能或覆盖代码(如 DI),而不是我想要将配置注入到安装过程中的特定问题。即使使用修改包,我仍然相信每次想要将我的应用程序指向不同的后端 URL 时,我仍然需要打包一个新的修改包。 - Alex
每次我想将我的应用程序指向不同的后端URL时,仍然需要打包一个新的修改包。 - zett42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接