Powershell Calling.NET Assembly que utiliza App.config
app-config (2)
Después de seguir investigando descubrí la causa. En un punto anterior del script, estaba cargando SMO:
$null = [reflection.assembly]::loadwithpartialname("microsoft.sqlserver.smo")
Creo que esto de alguna manera maneja mis ajustes de configuración. La solución fue hacer lo que Chris menciona arriba a esta llamada primero:
[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $null)
$null = [reflection.assembly]::loadwithpartialname("microsoft.sqlserver.smo")
Y luego, en mi segunda llamada a otra asamblea, haga esto:
$config_path = $assembly_exe + ".config"
[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path)
[Reflection.Assembly]::LoadFrom($assembly_exe)
Problema parece ser resuelto ...
Tengo una secuencia de comandos Powershell que carga un ensamblado .NET (.EXE en mi caso) y llama a un método público que utiliza el archivo app.config para extraer una cadena de conexión cifrada.
El script copia dinámicamente el archivo exe.config del ensamblaje en la carpeta Powershell ($ pshome) como powershell.exe.config y puede ejecutarse desde mi caja de desarrollo sin problemas. El problema es que no se ejecuta desde una instalación estándar de Windows Server 2003.
Verifiqué que exe.config se está copiando correctamente en el directorio powershell. He ejecutado SysInternals Process Explorer y verifiqué que el proceso estaba accediendo a los archivos de configuración (no se encontraron mensajes en el archivo). Depuré remotamente la instancia de powershell.exe y puedo ver que el ensamblaje se está cargando bien pero no puedo acceder a los valores del ConfigurationManager.AppSettings (devuelve nulo).
Me he quedado sin ideas. He leído que puedo usar un dominio de aplicación separado, pero no veo ejemplos de cómo hacer esto con Powershell.
Mi código hace algo al efecto de:
$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()
En Vista, el código funciona, en Windows Server 2003 el código no funciona.
Tratar:
[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $config_path)