问题描述
我有一个成熟的wcf应用程序,当前与wix打包在一起,生成了一个msi。当将msi安装在用户的PC上时(使用wix / msi gui或具有Powershell远程处理功能的msiexec自动化),它们会传入参数,例如应用程序后端Web服务的URL,这些参数将保存到应用程序的app.config文件中。
我正在寻找将wix安装程序替换为MSIX。此切换对我的主要好处是,用户可以从Web服务器URL自己安装应用程序,而不必费心下载和运行MSI。
要实现简单的单击和安装过程,并能够在不同的客户环境中登台MSIX,我需要某种方式来在登台应用程序时按环境设置应用程序的后端URL。鉴于MSIX是一个自容器程序包,其中所有文件都经过哈希处理和签名以确保不被篡改,因此在我暂存该应用程序时,是否有一种方法可以使我在不重新包装该应用程序的情况下重新打包该URL?
对于上下文,该应用程序是我们为许多客户定制的产品,因此在内部,我们一直在使用自动化工具不断部署许多环境,因此我希望避免在设置广告客户时动态地重新打包新环境。
我基本上想随配置一起提供,但不在msix内部。
解决方法
MSIX更改了我们在安装时配置应用程序的方式。使用MSIX软件包,您将无法再在安装过程中捕获用户输入(应用程序配置),也无法执行任何自定义代码。这意味着您不再可以选择在安装时自定义任何内容。
正如您所说,不能篡改MSIX中提供的文件。实现此行为的唯一方法是首次启动该应用程序时检索并应用其他设置。
-
这既可以手动完成,也就是您可以设计自定义对话框,让用户仅在首次启动应用程序时才能看到并填写这些对话框。
-
或者您可以实施依赖于您的AppInstaller URL的自动自定义支持,即每个用户必须收到一个不同的AppInstaller链接。当您的软件包安装在系统上时,它将缓存该链接,您可以使用预定义的API对其进行查询,从而根据您阅读的链接在应用程序中实现自定义行为。
在this example的MSIX技术社区论坛中,我使用PowerShell脚本包含了a sample which shows how you can save the AppInstaller URL in the registry。
现在,此样本依赖于Package Support Framework integration from Advanced Installer。使用此方法,您可以在不更改应用程序代码的情况下自定义MSIX软件包中包含的PS脚本,从而获得更大的灵活性。您甚至可以扩展PS脚本,以根据读取的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的处理方式有所不同,您可以在此处了解更多信息:
,这些在某种程度上类似于MSI转换文件,但是可以在MSIX文件之后安装(例如插件或DLC软件包)。它们基本上允许您在原始包的虚拟文件系统中添加或覆盖文件。您的应用程序可以读取存储URL的配置文件,而该文件可以通过安装修改包进行修改,而无需触摸原始的MSIX包。