C # само по себе работает как отдельное приложение с отдельным файлом конфигурации приложения. Если вы запустите это в C # интерактивно:
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
Вы увидите что-то вроде:
"<path to VS>\\CommonExtensions\\Microsoft\\ManagedLanguages\\VBCSharp\\InteractiveComponents\\InteractiveHost.exe.Config"
Итак, это используемый файл конфигурации. Конечно, он не содержит ваши переменные, поэтому код, пытающийся выполнить ConfigurationManager.AppSettings["foo"].ToString()
, терпит неудачу.
Обычный способ установить файл конфигурации во время выполнения:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", fullPathToYourConfig);
Однако, это должно быть сделано до любого доступа к файлу конфигурации. Когда первый доступ сделан - файл кэшируется, и последующие изменения пути не будут иметь никакого эффекта. К сожалению, прежде чем дать вам доступ к выполнению команд, C # интерактивный уже работает с этим файлом.
Существуют различные хаки с отражением для сброса этого кэша. Например (дословно скопировано из здесь ):
public static void ChangeConfigTo(string path)
{
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path);
typeof(ConfigurationManager)
.GetField("s_initState", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, 0);
typeof(ConfigurationManager)
.GetField("s_configSystem", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, null);
typeof(ConfigurationManager)
.Assembly.GetTypes()
.Where(x => x.FullName ==
"System.Configuration.ClientConfigPaths")
.First()
.GetField("s_current", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, null);
}
Имея все это в виду, если вы поместите эту функцию в класс Program
в своем примере на github и сделаете это в C # интерактивно:
Program.ChangeConfigTo(Path.GetFullPath("app.config"));
Ваш код будет работать так, как вы ожидаете. Вы можете поместить этот хак в отдельный файл скрипта (.csx
) и загрузить его с "#load", если необходимо.