Перемещение файла app.config на пользовательский путь
Можно ли переместить весь файл App.Config в пользовательский путь?
Кажется немного странным, что файл конфигурации находится в той же папке, что и exe, с новой поддержкой Windows для сохранения всех параметров программы в c:\ProgramData и всех.
Дополнительное требование, которое мы имеем, - это программно указать, где найти файл app.config. Причина этого заключается в том, что мы запускаем разные экземпляры службы из одного и того же exes и хотели бы сохранить каждый сервис app.config в этой папке параметров службы в каталоге c:\ProgramData \\.
Ответы
Ответ 1
Каждый AppDomain имеет/может иметь собственный файл конфигурации. По умолчанию AppDomain, созданный хостом CLR, использует 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
Если все еще актуально, мы использовали следующее, которое я нашел в другом предложенном ответе на другой вопрос здесь, в разделе Переполнение стека...
AppDomain.CurrentDomain.SetData ("APP_CONFIG_FILE", "path to config file")
Отлично работает для нас, когда у нас возникли проблемы с загрузкой app.config только из DLL...
Ответ 3
Я знаю, что это старый вопрос, но для тех, кто просто хочет, чтобы их app.config находился в другом месте, а затем в месте их сборки двоичных данных, следующее работает, как это предполагал Microsoft (и, следовательно, нет необходимости перечитывать и перезаписать файл на диск)
- Определите 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>
Обратите внимание на файл = "..\Config\settings.config" . Вы можете свободно определять путь к тому месту, где вы хотите, чтобы ваши пользователи меняли настройки.
Пример фактического файла конфигурации
<?xml version="1.0" encoding="utf-8"?>
<appSettings>
<add key="port" value="1234"/>
</appSettings>
Во время выполнения настройка port
будет иметь значение 1234.
Подробнее см. msdn
Ответ 4
Это сработало для меня.. (взято из 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;
или любая операция для извлечения конфигурации приложения, используется новый путь.
Надеюсь, это поможет кому-то другому, у кого такая же проблема!
Ответ 5
Это древний вопрос, но я столкнулся с этой проблемой и придумал хакерское обходное решение с нескольких минут в рефлекторе:
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
Прошу прощения, если я неправильно понимаю ваш запрос, но вы не можете использовать
ConfigurationManager.OpenExeConfiguration Method (String)
Основываясь на изменении, возможно ли, что вы можете использовать
Свойство AppDomainSetup.ConfigurationFile
Ответ 7
Вы можете использовать внешний вид вызова OpenExeConfiguration
. Если вы буквально хотите переместить свой файл конфигурации, вам придется создать свой собственный домен приложения. В процессе настройки домена вашего приложения вы можете указать, где находится файл конфигурации.
BTW, файлы конфигурации .NET не подходят для конфигурации, по крайней мере, не для того, что пользователи могут изменять: они не похожи на файлы INI или реестр. Если вам нужна гибкость в выборе конфигурации, вам лучше хранить ее отдельно.
Ответ 8
MSDN, вероятно, поможет...
Элемент упрощает обслуживание компонентов сборок. Если один или несколько приложения используют сборку, которая имеет файл конфигурации, находящийся в хорошо известное местоположение, конфигурация файлы приложений, которые используют сборка может использовать элемент к включить конфигурацию сборки файла, а не включая информацию о конфигурации напрямую. Когда сборка компонента обслуживание, обновление общих файл конфигурации обновляется информация о конфигурации для всех приложения, использующие сборку