Set*_*son 5 .net windows-installer
我有一个.NET解决方案,其中包含一个生成MSI的安装程序项目.MSI安装的其中一个项目包含一个App.Config文件.看起来该配置文件的值在编译时嵌入到MSI中.有没有办法在运行时覆盖它们?
例如,我正在使用的App.Config设置安装程序与之对话的Web服务的URL.是否可以在运行时覆盖此URL,以便在URL更改时不必重新编译MSI?
更新:我想我要问的是,我可以将具有特定名称的App.Config文件复制到我的安装程序目录中,以便它在运行时覆盖嵌入到MSI中的设置吗?
我知道我可以重新设计代码以检查其他地方的覆盖,例如注册表或众所周知的文本文件位置,但我的当务之急是在不重新编译的情况下解决此问题.(用户手中有很多安装盘)
在开发我目前正在开发的应用程序时,我们遇到了类似的挑战。我们希望能够在第一次启动时使用从另一台计算机或配置实用程序移植的设置进行预配置。老实说,我不知道我们的解决方案在宏伟的计划中有多好,但我可以告诉你我们做了什么,这对我们来说目前是有效的。
在我们的例子中,许多设置最终都在 app.config 文件中,不建议尝试从应用程序本身的外部进行操作。这是可以做到的,但它在一些微妙的方面是危险的。如果不是这种情况,最好的选择可能是为安装项目添加一个“自定义操作”,它将数据注入到文件、数据库或我们用来存储设置的任何内容中。有关如何执行此操作的起点可以在 MSDN 中找到。
但由于这不是一个选项,我们决定通过安装获取数据到应用程序的最简单方法(无需将其构建到安装包中)可能是使用“ride-along”文件。这是您的安装程序知道的文件,但未构建到 .MSI 中。安装时,它必须位于相对于 .MSI 的已知位置。您告诉安装项目该文件是什么、它应该在哪里以及将其放在哪里。然后,您的应用程序可以在启动时检查其是否存在,并处理在那里找到的任何内容。在您的情况下,这将是 URL 设置覆盖。然后应用程序可以删除该文件,这样它就不会在每次启动时加载。
在安装项目中,该文件需要设置一些属性,以确保它与 VS 安装项目生成的包的样式正常工作。确保您设置了这些,否则当由于不需要随行文件而被排除时,您可能会收到错误或其他奇怪的行为。
我们将文件命名为 AutoImport.Settings.xml。这是一个自定义 XML 文件,用于存储我们希望能够在安装应用程序时用来初始化应用程序的任何数据。它遵循我们在运行时从应用程序手动导出/导入配置时使用的相同格式,并使用相同的机制。如果它在那里找到该文件,它只会在启动时自动执行此操作。这使我们能够使用我们希望它具有的所有特定于网络的设置来配置一台“原型”计算机,导出这些设置,然后发送该导入文件,以便与我们在该网络环境中执行的任何其他安装一起自动加载。
正如我所说,感觉应该有一种“更好”的方法。我们唯一能想到的就是脱离 app.config 和 user.config 机制,这确实有其好处。因此,最终我们认为这是摩擦最小的替代方案,可以完全满足我们的需求。