App.config и F # Interactive не работают - PullRequest
16 голосов
/ 14 марта 2009

Пока я полирую свой маленький домашний проект, я пытаюсь сохранить все постоянные строки в моем файле app.config (ключи, XpathExpressions и т. Д.). Когда я запускаю скомпилированный exe-файл, это прекрасно работает. В интерактивной оболочке это не так.

Я пытался скопировать файл .config из каталога bin / Release в каталог obj / Debug & obj / Release, но вызов ConfigurationManager.AppSettings.Item("key") всегда возвращает ноль.

Есть предложения как это исправить?

С наилучшими пожеланиями

Ответы [ 5 ]

13 голосов
/ 18 сентября 2009

F # Interactive может работать с исполняемыми файлами, использующими app.config файлы.

Способ сделать это состоит в том, чтобы в вашем проекте был файл .fs, который загружает ваше условное .config в COMPILED, определяем так:

let GetMyConfig() =
  let config  = 
    #if COMPILED 
      ConfigurationManager.GetSection("MyConfig") :?> MyConfig
    #else                        
      let path = __SOURCE_DIRECTORY__ + "/app.config"
      let fileMap = ConfigurationFileMap(path) 
      let config = ConfigurationManager.OpenMappedMachineConfiguration(fileMap) 
      config.GetSection("MyConfig") :?> MyConfig
    #endif

затем в вашем файле скрипта укажите исполняемый файл, а #load файл .fs так:

#I "../Build/Path

#r "ConfiguredApp.exe"

#load "MyConfig.fs"

При выполнении этих трех строк вы увидите сообщение, подобное следующему в окне FSI:

[Loading C:\Svn\trunk\Source\ConfiguredApp\MyConfig.fs]

Binding session to 'C:\Svn\Qar\trunk\Build\Path\ConfiguredApp.exe'...

Обратите внимание, что вы на самом деле ссылаетесь на app.config в FSI (а не на сгенерированный .exe.config.)

Удачи ...

12 голосов
/ 14 марта 2009

Хотя FSI динамически генерирует код для вашего ввода, использование fsi.exe.config будет работать нормально.

Я создал этот файл:

<configuration>
    <appSettings>
        <add key="test" value="bar"/>
    </appSettings>
</configuration>

И сохранил его как "fsi.exe.config" (программные файлы \ fsharp-version \ bin).

Затем начался FSI:

> #r "System.configuration";;
--> Referenced 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.configuration.dll'

> System.Configuration.ConfigurationManager.AppSettings.["test"];;
val it : string = "bar"

Это также работало в Visual Studio. (Но учтите, что вам нужно будет сбросить сеанс для получения изменений.)

1 голос
/ 14 марта 2009

Проблема в том, что FSI - это другой exe-файл, который работает за кулисами и делает сумасшедшие трюки с компиляцией на лету и генерацией двоичных файлов. Проверьте, какая сборка FSI считает работающей . Вы можете быть удивлены тем, что вы найдете:)

Будет выдано сообщение об ошибке:

System.NotSupportedException: вызываемый член не поддерживается в динамическая сборка. в System.Reflection.Emit.AssemblyBuilder.get_Location ()

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

Удачи.

0 голосов
/ 07 сентября 2016

Я думаю, что я приведу ниже лучшее из обоих миров из двух самых популярных ответов выше (особенно для людей, пишущих скрипты fsx):

Данный файл app.config:

<configuration>
    <appSettings>
        <add key="foo" value="bar"/>
    </appSettings>
</configuration>

Читайте foo таким образом:

let appConfigPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "app.config")
let fileMap = ExeConfigurationFileMap()
fileMap.ExeConfigFilename <- appConfigPath
let config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None)
let foo = config.AppSettings.Settings.["foo"].Value
Console.WriteLine(foo)
0 голосов
/ 14 марта 2009

Возможно, вы могли бы указать FSI на файл app.config вручную, используя OpenMappedExeConfiguration метод в ConfigurationManager.

Также вы можете попробовать загрузить свою сборку в отдельном домене приложений - вы можете передать любой файл в качестве файла конфигурации для домена приложений, который вы создаете сами, используя класс AppDomainSetup .

Факт остается фактом, что FSI не очень подходит для такого сценария ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...