2013-04-25 12 views
7

Impossibile caricare il file App.Config nel dominio dell'app.Caricamento app.config nell'AppDomain

sto usando

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

dal Powershell Calling .NET Assembly that uses App.config ma il file app.config non è ancora caricato.

Ho anche provato a resettare la cache come spiegato in Using CurrentDomain.SetData("APP_CONFIG_FILE") doesn't work in PowerShell ISE.

Ecco il mio script di test:

$configFile = "{ActualPhysicalPath}\App.Config" 
gc $configFile 

Add-Type -AssemblyName System.Configuration 
[Configuration.ConfigurationManager].GetField("s_initState", "NonPublic, Static").SetValue($null, 0) 
[Configuration.ConfigurationManager].GetField("s_configSystem", "NonPublic, Static").SetValue($null, $null) 
([Configuration.ConfigurationManager].Assembly.GetTypes() | where {$_.FullName -eq "System.Configuration.ClientConfigPaths"})[0].GetField("s_current", "NonPublic, Static").SetValue($null, $null) 

[Configuration.ConfigurationManager]::ConnectionStrings[0].Name 
[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $null) 
[Configuration.ConfigurationManager]::ConnectionStrings[0].Name 
[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $configFile) 
[Configuration.ConfigurationManager]::ConnectionStrings[0].Name 

sto ottenendo sempre le stringhe di connessione memorizzate nel machine.config, piuttosto che quelli nel App.config.

Come posso ottenere il mio specifico file App.Config caricato nel dominio dell'app?

+0

Hai provato a utilizzare il metodo ConfigurationManager.OpenExeConfiguration? –

+0

Ho appena provato e non funziona ancora –

+0

ho frainteso la domanda. Scusate. Non puoi rinominare il file di configurazione su YOUR_APPLICATION_NAME.exe.config e copiarlo nella cartella dell'applicazione? Questo dovrebbe funzionare. L'applicazione caricherà quel file. –

risposta

9

provare a spostare il tuo SetData dichiarazione davanti alla dichiarazione GetField.

Con PowerShell 5.0 in Windows 10, le indicazioni fornite dalla the link you reference sembra funzionare: sono in grado di recuperare entrambi i AppSettings e connectionStrings.

Add-Type -AssemblyName System.Configuration 

# Set this to the full path of your App.config 
$configPath = "C:\Full\Path\To\App.config" 

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $configPath) 
[Configuration.ConfigurationManager].GetField("s_initState", "NonPublic, Static").SetValue($null, 0) 
[Configuration.ConfigurationManager].GetField("s_configSystem", "NonPublic, Static").SetValue($null, $null) 
([Configuration.ConfigurationManager].Assembly.GetTypes() | where {$_.FullName -eq "System.Configuration.ClientConfigPaths"})[0].GetField("s_current", "NonPublic, Static").SetValue($null, $null) 

[System.Configuration.ConfigurationManager]::AppSettings 
[System.Configuration.ConfigurationManager]::ConnectionStrings 
+0

Non ho uno spazio di lavoro funzionante per testarlo, ma se qualcuno può confermare che funziona, ti darò la risposta. Grazie per aver dedicato del tempo a quella domanda davvero vecchia –

-1

Hai provato la soluzione qui presentata: Change default app.config at runtime

Sembra di descrivere una sorta di cache e che più lavoro deve essere fatto per garantire che i dati caricati viene letto.

La parte importante della prima risposta è: "Esiste una classe ClientConfigPaths che memorizza nella cache i percorsi. Quindi, anche dopo aver modificato il percorso con SetData, non viene riletto, poiché esistono già valori memorizzati nella cache. è quello di rimuovere questi, anche"