覆盖嵌入到MSI中的app.config设置?

时间:2010-04-30 13:36:45

标签: .net windows-installer

我有一个.NET解决方案,其中包含一个生成MSI的安装程序项目。 MSI安装的其中一个项目包含一个App.Config文件。看起来该配置文件的值在编译时嵌入到MSI中。有没有办法在运行时覆盖

例如,我正在使用的App.Config设置安装程序与之对话的Web服务的URL。是否可以在运行时覆盖此URL,以便在URL更改时不必重新编译MSI?

更新:我想我要问的是,我可以将具有特定名称的App.Config文件复制到我的安装程序目录中,以便在运行时覆盖设置嵌入MSI?

我知道我可以重新设计代码以检查其他地方的覆盖,例如注册表或众所周知的文本文件位置,但我的当务之急是在不重新编译的情况下解决此问题。 (用户手中有很多安装盘)

3 个答案:

答案 0 :(得分:1)

在开发我目前正在开发的应用程序时,我们遇到了类似的挑战。我们希望能够在第一次预先配置从另一台计算机或配置实用程序移植的设置时启动全新安装。老实说,我不知道我们的解决方案在宏伟计划中有多好,但我现在可以告诉你我们做了什么,这对我们有用。

在我们的示例中,其中许多设置最终都出现在app.config文件中,建议不要尝试从应用程序本身外部进行操作。它可以做到,但它以几种微妙的方式是危险的。如果不是这种情况,最好的选择可能是为安装项目添加一个“自定义操作”,将数据注入文件,数据库或我们用于存储设置的任何内容。可以找到in MSDN的起点。

但由于这不是一个选项,我们认为可能最简单的方法是通过安装将数据传输到应用程序而不将其构建到安装包中,这将是使用“骑行”文件。这是您的安装知道的文件,但不是构建到.MSI中的文件。安装时,它必须简单地位于相对于.MSI的已知位置。您告诉安装项目该文件是什么,它应该在哪里,以及放在哪里。然后您的应用程序可以在启动时检查它的存在,并处理它在那里找到的任何内容。在您的情况下,这将是URL设置覆盖。然后应用程序可以删除该文件,因此每次启动时都不会加载。

在安装项目中,文件需要设置一些属性,以确保它与VS安装项目生成的包的样式一起正常工作。确保你设置这些,或者当骑行文件被排除时你可能会得到错误或其他奇怪的行为,因为它不需要。

  • 条件:不重新安装
  • PacakgeAs:vsdpaLoose
  • 重要:错误

我们将文件称为AutoImport.Settings.xml。这是一个自定义XML文件,用于存储我们希望能够在安装时初始化应用程序的任何数据。它遵循我们在运行时从应用程序手动导出/导入配置时使用的相同格式,并使用相同的机制。它只是在启动时自动执行,如果它在那里找到文件。这允许我们配置一台“原型”机器,其中包含我们希望它具有的所有网络特定设置,导出这些设置,然后发送该导入文件,以便在我们在该网络环境中进行的任何其他安装中自动加载。

正如我所说,感觉应该有一种“更好”的方式。我们可以提出的唯一一个意味着离开app.config和user.config机制,这些机制确实有它们的好处。所以最后我们认为这是摩擦最小的替代品,完全满足了我们的需求。

答案 1 :(得分:0)

如果您需要安装程序与Web服务通信,您将在何处存储URL,如果不在安装程序本身中?

如果您有一个众所周知的地方寻找URL(“常量”URL,数据库,文件共享等),您可以在安装程序中包含其地址。否则,没有地方可以从...获取URL

答案 2 :(得分:0)

如果您将url公开为公共属性(即Proeprties表中所有属于大写的属性都被视为公共属性 - 我不知道您是否在VS中的安装程序项目中具有此级别的控制权限)您可以在运行MSI时从命令行进行设置。对于您的特定问题,这不是一个很好的长期解决方案 - 也许更好的想法是建立一个不会改变的已知地址的初始连接,并且它可以返回您想要的真实Web服务的当前地址与...交谈。