2009-05-07 9 views
17

.NET 어셈블리 (내 경우에는 .EXE)를로드하고 app.config를 사용하는 공용 메서드를 호출하여 암호화 된 연결 문자열을 가져 오는 PowerShell 스크립트가 있습니다.Powershell App.config를 사용하는 .NET 어셈블리를 호출합니다.

스크립트는 어셈블리의 exe.config를 powershell.exe.config 파일로 Powershell ($ pshome) 폴더로 동적으로 복사하고 내 개발 상자에서 제대로 실행할 수 있습니다. 문제는 표준 Windows Server 2003 설치에서 실행되지 않는다는 것입니다.

exe.config가 powershell 디렉토리로 올바르게 복사되고 있는지 확인했습니다. SysInternals Process Explorer를 실행하고 프로세스가 구성 파일 (파일을 찾을 수 없음)에 액세스하고 있는지 확인했습니다. 원격으로 powershell.exe 인스턴스를 디버깅했으며 어셈블리가 잘로드되고 있지만 ConfigurationManager.AppSettings [...] 값 (null을 반환)에 액세스 할 수 없음을 알 수 있습니다.

나는 생각이 없습니다. 별도의 앱 도메인을 사용할 수는 있지만 PowerShell을 사용하여 예제를 볼 수는 없다는 것을 읽었습니다.

내 코드의 효과에 무언가를 :

코드는 코드가 작동하지 않는 Windows Server 2003에서, 작동 Vista에서는
$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() 

.

답변

35

시도 :

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

이것이 작동하면 내 영웅이됩니다. –

+0

VS2008에 빌드 된 noddy 어셈블리와 XP에서 작동하는 WS2003을 사용하지 않아도 작동한다는 것을 확인했습니다. 행복하게 테스트하고 투표하십시오 :) –

+0

며칠 루프에서 빠져 나와 내일 촬영할 것입니다. 감사! – GabeA

4

더 연구 후에 나는 원인을 발견했다. 스크립트의 초기 단계에서 SMO를로드 중이었습니다.

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

이 구성 방법을 사용하여 구성 설정을 변경하는 방법을 생각합니다.

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

그리고 다른 어셈블리 내 두 번째 호출이 작업을 수행에 : 수정 크리스가 먼저 호출에 위의 언급으로 수행했다

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

문제가 해결 될 것으로 보인다 ...

관련 문제