2011-04-05 4 views
2

WCF 서비스가 .NET 응용 프로그램을 시작하고 그 출력을 캡처하는 상황이 있습니다. 예, 그게 못생긴지만, 그건 별개의 문제입니다. 내가 겪고있는 문제는 WCF 서비스에 대한 입력에 따라 다른 구성 파일을 사용하여 하위 프로세스를 시작해야한다는 것입니다. 자식 프로세스로 코드를 변경할 수 없으므로 인수를 기반으로 구성 파일을 동적으로로드 할 수 없습니다. AppDomain 메서드가 here으로 제안 된 것을 보았습니다.하지만 내 지식에 따르면 프로세스 개체에 대한 액세스 권한을 얻지 못하기 때문에 출력을 캡처 할 수 없습니다..NET 응용 프로그램에 대해 다른 구성 파일 지정

그래서이 방법이 있습니까? 별도의 구성 파일을 유지 관리하고 런타임에 "기본"위치에 복사하는 것은 옵션이지만 추악한 경쟁 조건이 발생할 수 있습니다. 더 좋은 아이디어? AppDomain에서 실행중인 프로세스를 추출하는 방법은 무엇입니까?

답변

1

경쟁 조건을 피하는 한 가지 옵션은 각 호출시 응용 프로그램에 대한 새 디렉터리를 만들고 응용 프로그램을 해당 디렉터리에 복사 한 다음 사용자 지정 구성 파일을 작성하게하는 것입니다. 물론 응용 프로그램이 종료 될 때 서비스에서 해당 디렉토리를 삭제해야합니다. 또는 임시 디렉토리를 수시로 삭제하는 일종의 스위퍼 프로그램이 필요합니다.

응용 프로그램이 하나의 실행 파일이면 해당 솔루션이 제대로 작동합니다. 많은 다른 어셈블리가있는 경우 위와 같이 임시 실행 파일 만 기본 실행 파일로 복사하고 실행 파일이 원본 디렉터리의 다른 어셈블리를 찾을 수 있도록 PATH 환경 변수를 수정하게 할 수 있습니다.

+0

그래, 나는 이것과 비슷한 해결책을 생각했다. 그것은 효과가 있지만, 특히 "꽤"나는 기존 응용 프로그램에 다른 구성 파일을로드하도록 설득하는 솔루션과 비교됩니다. 그렇다면 다시,이 상황에 관한 어떤 것도 예쁜 것이 아니기 때문에 그것을 할 수있는 방법 일 수도 있습니다 ... – Deeko

2

나는 내가 원하는 것에 거의 맞는 해결책을 생각해 냈습니다. 같은 프로세스이기 때문에 새로운 AppDomain 실행을위한 프로세스를 얻을 수 없습니다. 따라서 현재 출력을 잡아냅니다 .... 새 AppDomain을 만들면 (아래처럼) WCF 서비스 호출자 (ASPX 페이지)는 사용자 이름을 두 번 묻고 오류 메시지없이 실패합니다. AppDomain.SetData를 사용하여 현재 도메인의 구성을 변경하면 프로세스 실행을 시작하지만 이상한 오류가 발생합니다. 프로세스가 의존성을 찾을 수없는 것처럼 보인다 (아직 존재 함). 이 코드가 잘못된 것 같습니까?

StringBuilder buffer = new StringBuilder(); 
StringWriter writer = new StringWriter(buffer); 
Console.SetOut(writer); 

AppDomainSetup domainSetup = new AppDomainSetup(); 
domainSetup.ApplicationBase = CommandLinePath; 
domainSetup.ConfigurationFile = String.Format("{0}.{1}.config", ApplicationName, modifier); 

AppDomain newDomain = AppDomain.CreateDomain("NewDomain", null, domainSetup); 
newDomain.ExecuteAssembly(CommandLinePath + ApplicationName, null, args); 

return buffer.ToString(); 
관련 문제