代码之家  ›  专栏  ›  技术社区  ›  Ries

将app.config文件重新定位到自定义路径

  •  23
  • Ries  · 技术社区  · 15 年前

    是否可以将整个App.Config文件重新定位到自定义路径?

    这似乎有点奇怪,配置文件与exe位于同一个文件夹中,Windows的新方法是将所有程序设置保存在c:\ProgramData和all中。

    我们还有一个额外的要求,就是通过编程指定在哪里可以找到app.config文件。原因是我们从同一个EXE生成不同的服务实例,并希望将每个服务的app.config存储在该服务的设置文件夹中的c:\ProgramData\\下。

    8 回复  |  直到 15 年前
        1
  •  18
  •   mYsZa    15 年前

    每个AppDomain都有/可以有自己的配置文件。CLR主机创建的默认AppDomain使用programname.exe.config;如果要提供自己的配置文件,请创建单独的AppDomain。例子:

    // get the name of the assembly
    string exeAssembly = Assembly.GetEntryAssembly().FullName;
    
    // setup - there you put the path to the config file
    AppDomainSetup setup = new AppDomainSetup();
    setup.ApplicationBase = System.Environment.CurrentDirectory;
    setup.ConfigurationFile = "<path to your config file>";
    
    // create the app domain
    AppDomain appDomain = AppDomain.CreateDomain("My AppDomain", null, setup);
    
    // create proxy used to call the startup method 
    YourStartupClass proxy = (YourStartupClass)appDomain.CreateInstanceAndUnwrap(
           exeAssembly, typeof(YourStartupClass).FullName);
    
    // call the startup method - something like alternative main()
    proxy.StartupMethod();
    
    // in the end, unload the domain
    AppDomain.Unload(appDomain);
    

    希望有帮助。

        2
  •  40
  •   newby    12 年前

    AppDomain.CurrentDomain.SetData ("APP_CONFIG_FILE", "path to config file")
    

    当我们仅从DLL加载app.config出现问题时,这对我们来说非常有用。。。

        3
  •  7
  •   namford    10 年前

    这对我很有用(取自 http://msdn.microsoft.com/en-us/library/system.configuration.appsettingssection.aspx )

    // open config
    System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    
    // update appconfig file path
    config.AppSettings.File = "C:\\dev\\App.config";
    
    // Save the configuration file.
    config.Save(ConfigurationSaveMode.Modified);
    
    // Force a reload in memory of the changed section.
    ConfigurationManager.RefreshSection("appSettings");
    

    那么当你打电话的时候

    NameValueCollection settings = System.Configuration.ConfigurationManager.AppSettings;
    

    或任何获取应用程序配置的操作,将使用新路径。

        4
  •  7
  •   bas    10 年前

    我知道这是一个老问题,但对于那些 只是 如果希望将app.config放在与二进制输出构建位置不同的位置,则以下内容将按照microsoft的预期工作(因此无需重新读取文件并将其写入磁盘)

    • 定义另一个配置文件,其中包含实际的配置文件
    • 更改app.config,使其引用配置文件

    在运行时,配置文件中的设置将覆盖app.config(如果存在)中的设置。你就完了。

    示例app.config

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
        </startup>
      <appSettings file="..\Config\settings.config">
        <add key="port" value="1001"/>
      </appSettings>
    </configuration>
    

    注意 . 您完全可以自由定义要用户更改设置的位置的路径。

    实际配置文件的示例

    <?xml version="1.0" encoding="utf-8"?>
    <appSettings>
      <add key="port" value="1234"/>
    </appSettings>
    

    在运行时设置 port 将具有值1234。

    msdn

        5
  •  2
  •   wrmsr    13 年前

    这是一个古老的问题,但我遇到了同样的问题,并在reflector中的几分钟内想出了一个骇人的解决方法:

    static public class ConfigHack {
        static public void OverrideAppConfig(string path) {
            ((AppDomainSetup)
                typeof(AppDomain)
                    .GetField("_FusionStore", BindingFlags.NonPublic | BindingFlags.Instance)
                    .GetValue(AppDomain.CurrentDomain))
            .ConfigurationFile = path;
        }
    
        static public void ResetConfigManager() {
            typeof(ConfigurationManager)
                .GetField("s_initState", BindingFlags.Static | BindingFlags.NonPublic)
                .SetValue(null, 0);
        }
    }
    

    我只在.NET2上使用过它,但在反射镜中它在4中看起来是一样的。当然,我不建议运输这个:P我只用于快速内部事务。

        6
  •  1
  •   Adriaan Stander    15 年前

    如果我误解了你的要求,我很抱歉,但是你不能使用吗

    ConfigurationManager.OpenExeConfiguration Method (String)

    根据更改,您是否可以使用

    AppDomainSetup.ConfigurationFile Property

        7
  •  1
  •   Tim Robinson    15 年前

    你可以用阿斯塔德的方法打电话 OpenExeConfiguration

    顺便说一句,.NET配置文件不适合配置,至少不是用户可以修改的类型:它们不像INI文件或注册表。如果您希望在配置的来源方面具有灵活性,最好将其单独存储。

        8
  •  -1
  •   Mhmetengineer    4 年前

    如果你使用注册表,你的问题可以得到解决。

        9
  •  -3
  •   Kamran Khan    15 年前

    MSDN 可能会有帮助。。。

    元素 应用程序使用具有 驻留在数据库中的配置文件 众所周知的位置、配置 使用 程序集可以使用 元素到 包括程序集配置 文件,而不是包括 直接获取配置信息。 已服务,正在更新公共服务 配置文件提供了更新的 向所有用户发送配置信息 使用程序集的应用程序