是否可以将整个App.Config文件重定位到自定义路径?
配置文件与exe文件位于同一文件夹中似乎有点奇怪,Windows的新approcah保存了c:\ ProgramData中的所有程序设置。
我们的另一个要求是以编程方式指定在哪里找到app.config文件。这样做的原因是我们从相同的exes生成不同的服务实例,并希望将每个服务的app.config存储在c:\ ProgramData \\下的该服务的settings文件夹中。
答案 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
<?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)
答案 6 :(得分:0)
您可以使用旁观者调用OpenExeConfiguration
的方法。如果您真的想要重新定位配置文件,则必须创建自己的应用程序域。在设置应用程序域的过程中,您可以指定配置文件的位置。
答案 7 :(得分:0)
如果您使用注册表,则可以解决您的问题。
答案 8 :(得分:-3)
MSDN可能会有所帮助...
元素 简化了组件的维护 组件。如果一个或多个 应用程序使用具有的程序集 驻留在的配置文件 众所周知的位置,配置 使用该应用程序的应用程序的文件 装配可以使用 元素来 包括装配配置 文件,而不是包括 配置信息直接。 当组件组件是 服务,更新常见 配置文件提供更新 配置信息给所有人 使用程序集的应用程序