Подтвердить что ты не робот

Перемещение файла app.config на пользовательский путь

Можно ли переместить весь файл App.Config в пользовательский путь?

Кажется немного странным, что файл конфигурации находится в той же папке, что и exe, с новой поддержкой Windows для сохранения всех параметров программы в c:\ProgramData и всех.

Дополнительное требование, которое мы имеем, - это программно указать, где найти файл app.config. Причина этого заключается в том, что мы запускаем разные экземпляры службы из одного и того же exes и хотели бы сохранить каждый сервис app.config в этой папке параметров службы в каталоге c:\ProgramData \\.

4b9b3361

Ответ 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 Я использую его только для быстрых внутренних вещей.

Ответ 7

Вы можете использовать внешний вид вызова OpenExeConfiguration. Если вы буквально хотите переместить свой файл конфигурации, вам придется создать свой собственный домен приложения. В процессе настройки домена вашего приложения вы можете указать, где находится файл конфигурации.

BTW, файлы конфигурации .NET не подходят для конфигурации, по крайней мере, не для того, что пользователи могут изменять: они не похожи на файлы INI или реестр. Если вам нужна гибкость в выборе конфигурации, вам лучше хранить ее отдельно.

Ответ 8

MSDN, вероятно, поможет...

Элемент упрощает обслуживание компонентов сборок. Если один или несколько приложения используют сборку, которая имеет файл конфигурации, находящийся в хорошо известное местоположение, конфигурация файлы приложений, которые используют сборка может использовать  элемент к включить конфигурацию сборки файла, а не включая информацию о конфигурации напрямую. Когда сборка компонента обслуживание, обновление общих файл конфигурации обновляется информация о конфигурации для всех приложения, использующие сборку