2009-05-07 16 views
17

Ho uno script PowerShell che carica un assembly .NET (.EXE nel mio caso) e chiama un metodo pubblico che utilizza l'app.config per estrarre una stringa di connessione crittografata.Powershell chiamata .NET Assembly che utilizza App.config

Lo script copia dinamicamente il file exe.config sulla cartella Powershell ($ pshome) come powershell.exe.config ed è in grado di eseguire correttamente dalla mia casella di sviluppo. Il problema è che non viene eseguito da un'installazione standard di Windows Server 2003.

Ho verificato che exe.config sia stato copiato correttamente nella directory di PowerShell. Ho eseguito SysInternals Process Explorer e verificato che il processo stava accedendo ai file di configurazione (nessun file non trovato messaggi). Ho eseguito il debug in remoto dell'istanza di powershell.exe e posso vedere che l'assembly sta caricando correttamente ma non può accedere ai valori di ConfigurationManager.AppSettings [...] (restituisce null).

Sono fuori di idee. Ho letto che potrei essere in grado di utilizzare un dominio app separato ma non vedo esempi di ciò con Powershell.

Il mio codice fa qualcosa per l'effetto di:

$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() 

In Vista il codice funziona, in Windows Server 2003, il codice non funziona.

risposta

35

Prova:

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

Se funziona, sarai il mio eroe. –

+0

Confermato che funziona con un assembly noddy costruito in VS2008 e che gira su XP, non ha WS2003 a portata di mano, ma spero che funzioni anche lì. Per favore, prova e vota se felice :) –

+0

Sei fuori dal giro da qualche giorno, gli darai uno scatto domani. Grazie! – GabeA

4

Dopo la ricerca di ulteriori ho scoperto la causa. In un punto precedente della sceneggiatura che stavo caricando SMO:

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

Credo che un po 'come maneggia le mie impostazioni di configurazione. La correzione è stato quello di fare come Chris accenna sopra per questa chiamata prima:

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

E poi la mia seconda chiamata ad un altro gruppo di fare questo:

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

problema sembra essere risolto ...