Вызов Powershell .NET Assembly, использующий App.config - PullRequest
20 голосов
/ 07 мая 2009

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

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

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

У меня нет идей. Я читал, что могу использовать отдельный домен приложения, но не вижу примеров того, как сделать это с помощью 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 код не работает.

Ответы [ 2 ]

37 голосов
/ 07 мая 2009

Попробуйте:

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path)
5 голосов
/ 12 мая 2009

После дальнейших исследований я выяснил причину. На более раннем этапе сценария я загружал 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)

Проблема, похоже, решена ...

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