Pergunta

Eu tenho um script PowerShell que está carregando um .NET assembly (.EXE no meu caso) e chamar um método público que usa o app.config para puxar uma seqüência de conexão criptografada.

O script dinamicamente cópias exe.config da assembléia até a pasta como powershell.exe.config PowerShell ($ pshome) e é capaz de executar de minha caixa de desenvolvimento muito bem. O problema é que ele não é executado a partir de uma instalação padrão do Windows Server 2003.

I verificou a exe.config está sendo copiados para o diretório PowerShell corretamente. Já corri SysInternals Process Explorer e verificado que o processo estava acessando os arquivos de configuração (nenhum arquivo de mensagens não encontradas). Eu depurado remotamente a instância powershell.exe e pode ver que a montagem é de carregamento bem, mas não pode ConfigurationManager.AppSettings de acesso [...] valores (retorna null).

Eu estou fora de ideias. Eu li que eu possa ser capaz de usar um domínio de aplicativo separado, mas não vejo exemplos de fazer isso com o PowerShell.

O meu código faz algo no sentido 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()  

No Vista o código funciona, no Windows Server 2003, o código não funciona.

Foi útil?

Solução

Tente:

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

Outras dicas

Depois de pesquisar mais eu descobri a causa. Em um ponto anterior no script eu estava carregamento SMO:

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

Eu acredito que esta de alguma forma Mangles minhas definições de configuração. A correção foi fazer como Chris menciona acima para esta primeira chamada:

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

E, em seguida, na minha segunda chamada para outro assembly fazer isso:

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

O problema parece estar resolvido ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top