Powershell Calling.NET Assembly, использующая App.config

У меня есть Powershell script, который загружает сборку .NET(.EXE в моем случае) и вызывает открытый метод, который использует app.config для вытягивания зашифрованной строки соединения.

script динамически копирует сборку exe.config в папку Powershell ($ pshome) в виде powershell.exe.config и может работать из моей коробки разработки просто отлично. Проблема в том, что он не запускается со стандартной установки Windows Server 2003.

Я проверил, что exe.config правильно копируется в каталог powershell. Я запустил SysInternals Process Explorer и проверил, что процесс имеет доступ к файлам конфигурации (без файлов, не найденных сообщений). Я удаленно отлаживал экземпляр powershell.exe и вижу, что сборка отлично загружается, но не может получить доступ к параметрам ConfigurationManager.AppSettings [...] (возвращает null).

У меня нет идей. Я читал, что я могу использовать отдельный домен приложения, но я не вижу примеров этого с Powershell.

Мой код делает что-то вроде:

$absolute_path = "c:\foo.exe"
$config_path = $absolute_path + ".config"
copy "$config_path" "$pshome\powershell.exe.config" -Force
[Reflection.Assembly]::LoadFrom($absolute_path)
$foo = new-object MyFooAssembly.FooClass
$foo.DoSomething()  

В Vista код работает, в Windows Server 2003 код не работает.

Ответ 1

Try:

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path)

Ответ 2

После исследования я выяснил причину. В более ранней точке script я загружал SMO:

$null = [reflection.assembly]::loadwithpartialname("microsoft.sqlserver.smo") 

Я считаю, что некоторые из них меняют настройки моей конфигурации. Исправление было связано с тем, что Крис упоминает выше для этого вызова:

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $null)
$null = [reflection.assembly]::loadwithpartialname("microsoft.sqlserver.smo") 

И затем во втором вызове другой сборки выполните следующее:

$config_path = $assembly_exe + ".config"
[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path)
[Reflection.Assembly]::LoadFrom($assembly_exe)

Проблема, по-видимому, решена...