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

时间:2009-12-03 08:59:01

标签: c# .net path app-config

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

配置文件与exe文件位于同一文件夹中似乎有点奇怪,Windows的新approcah保存了c:\ ProgramData中的所有程序设置。

我们的另一个要求是以编程方式指定在哪里找到app.config文件。这样做的原因是我们从相同的exes生成不同的服务实例,并希望将每个服务的app.config存储在c:\ ProgramData \\下的该服务的settings文件夹中。

9 个答案:

答案 0 :(得分:37)

如果仍然相关,我们在Stack Overflow上使用了以下我在另一个问题的另一个建议答案中找到的以下内容......

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

当我们从DLL加载app.config时遇到问题......

答案 1 :(得分: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 :(得分:5)

这对我有用..(取自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;

或任何获取应用配置的操作,都会使用新路径。

希望这可以帮助其他有同样问题的人!

答案 3 :(得分:5)

我知道这是一个老问题,但是对于那些只是希望将app.config放在不同位置然后是二进制输出构建位置的人,以下工作就像微软想要的那样(和因此无需重新读取并将文件重新写入磁盘)

  • 像往常一样定义app.config。
  • 定义您想要拥有实际配置文件的另一个配置文件
  • 更改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>

请注意 file =“.. \ Config \ settings.config”。您可以完全自由地定义希望用户更改设置的位置的路径。

实际配置文件的示例

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

在运行时,设置port的值为1234。

更多信息,请参阅msdn

答案 4 :(得分:2)

这是一个古老的问题,但我遇到了同样的问题,并在反射器中提出了几分钟的hacky解决方法:

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上使用它,但在反射器中它看起来相同。当然我不建议发送这个:P我只用它来快速内部。

答案 5 :(得分:1)

如果我误解了您的请求,我很抱歉,但您不能使用

ConfigurationManager.OpenExeConfiguration Method (String)

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

AppDomainSetup.ConfigurationFile Property

答案 6 :(得分:0)

您可以使用旁观者调用OpenExeConfiguration的方法。如果您真的想要重新定位配置文件,则必须创建自己的应用程序域。在设置应用程序域的过程中,您可以指定配置文件的位置。

BTW,.NET配置文件不适合配置,至少不是用户可以修改的类型:它们不像INI文件或注册表。如果您希望灵活配置来自您的配置,最好单独存储它。

答案 7 :(得分:0)

如果您使用注册表,则可以解决您的问题。

答案 8 :(得分:-3)

MSDN可能会有所帮助...

  

元素   简化了组件的维护   组件。如果一个或多个   应用程序使用具有的程序集   驻留在的配置文件   众所周知的位置,配置   使用该应用程序的应用程序的文件   装配可以使用    元素来   包括装配配置   文件,而不是包括   配置信息直接。   当组件组件是   服务,更新常见   配置文件提供更新   配置信息给所有人   使用程序集的应用程序