代码之家  ›  专栏  ›  技术社区  ›  Seth Petry-Johnson

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

  •  5
  • Seth Petry-Johnson  · 技术社区  · 14 年前

    我有一个.NET解决方案,其中包含生成MSI的安装程序项目。MSI安装的一个项目包含app.config文件。似乎该配置文件的值在编译时嵌入到msi中。有没有办法覆盖它们 运行时 ?

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

    更新: 我想我要问的是,我能不能把一个app.config文件复制到我的安装程序目录中,这样它就能在运行时覆盖嵌入到msi中的设置?

    我知道我可以重新设计代码来检查其他地方的重写,比如注册表或一个众所周知的文本文件位置,但是我现在需要的是在不重新编译的情况下解决这个问题。(用户手中有很多安装盘)

    3 回复  |  直到 14 年前
        1
  •  1
  •   Chris Ammerman    14 年前

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

    在我们的例子中,这些设置中的许多最终会出现在app.config文件中,不建议尝试从应用程序本身外部操作该文件。这是可以做到的,但有几个微妙的方面是危险的。如果不是这样,最好的选择可能是为安装项目添加一个“自定义操作”,将数据注入到文件、数据库或我们用来存储设置的任何东西中。如何做到这一点的起点可以找到 in MSDN .

    但由于这不是一个选项,我们决定,可能最简单的方法,通过安装到应用程序,而不是建立在安装包中的数据,将是使用一个“搭便车”文件。这是一个您的安装程序知道的文件,但它没有内置到.msi中。安装时,它必须位于相对于.msi的已知位置。告诉安装项目该文件是什么,应该在哪里,以及放在哪里。然后,应用程序可以在启动时检查其是否存在,并处理在那里找到的任何内容。在您的情况下,这将是一个url设置覆盖。然后应用程序可以删除文件,这样就不会每次启动时都加载它。

    在安装项目中,该文件需要设置一些属性,以确保它与VS安装项目生成的包的样式一起正常工作。确保您设置了这些,否则当随车文件因不需要而被排除时,可能会出现错误或其他怪异行为。

    • 条件:不重新安装
    • 包装:vsdpaloose
    • 重要:错误

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

    正如我所说,感觉应该有一个“更好”的方法。我们唯一能想到的方法是脱离app.config和user.config机制,这两种机制确实有其好处。所以最后我们决定这是一个最低摩擦的替代方案,充分满足了我们的需求。

        2
  •  0
  •   VladV    14 年前

    如果您需要安装程序与web服务对话,那么如果不在安装程序本身中,您要将url存储在哪里?

    如果您有一个著名的地方寻找url(一个“常量”url、数据库、文件共享等),那么您可以在安装程序中包含它的地址。否则就没有地方可以从…

        3
  •  0
  •   slugster Joey Cai    14 年前

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