2009-05-07 6 views
17

Mam skrypt PowerShell, który ładuje zestaw .NET (.EXE w moim przypadku) i wywołanie publicznej metody, która używa app.config do ciągnięcia zaszyfrowanego ciągu połączenia.Powershell Calling .NET Assembly, który używa App.config

Skrypt dynamicznie kopiuje plik exe.config zespołu do folderu Powershell ($ pshome) jako powershell.exe.config i jest w stanie uruchomić się z mojego okna programowania. Problem polega na tym, że nie działa on ze standardowej instalacji systemu Windows Server 2003.

Sprawdziłem, czy plik exe.config został poprawnie skopiowany do katalogu PowerShell. Uruchomiłem Eksplorator procesów SysInternals i zweryfikowałem, że proces uzyskiwał dostęp do plików konfiguracyjnych (brak komunikatów nie znalezionego pliku). Zdalnie debugowałem wystąpienie powershell.exe i widzę, że zespół ładuje się poprawnie, ale nie może uzyskać dostępu do wartości [...] ConfigurationManager.AppSettings (zwraca wartość null).

Brakuje mi pomysłów. Czytałem, że mogę używać oddzielnej domeny aplikacji, ale nie widzę przykładów robienia tego z Powershell.

Mój kod robi coś do skutku:

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

W Vista kod działa w systemie Windows Server 2003 kod nie działa.

Odpowiedz

35

Spróbuj:

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

Jeśli to zadziała, będziesz moim bohaterem. –

+0

Potwierdziłem, że działa z nieudolnym zestawem wbudowanym w VS2008 i działającym na XP, nie mając pod WS2003 pod ręką, ale mam nadzieję, że to też zadziała. Przetestuj i zagłosuj, jeśli jesteś szczęśliwy :) –

+0

Wyleciałem z pętli kilka dni, jutro oddam strzał. Dzięki! – GabeA

4

Po zbadaniu dalej znalazłem przyczynę. Na wcześniejszym etapie scenariusza byłem ładowania SMO:

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

Wierzę, że to jakiś sposób Zmieniany swoje ustawienia konfiguracyjne. Rozwiązaniem było zrobić jak Chris wspomina powyżej do niniejszego zaproszenia pierwsze:

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

A potem na moje drugie wezwanie do innego zespołu to zrobić:

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

Problem wydaje się być rozwiązany ...