2012-05-21 2 views
3

비즈니스 로직이 런타임에로드되는 dll에 배치되도록 백엔드를 구성했습니다. ShadowCopyFiles = true 및 파일 시스템 모니터링을 사용하여 호스트 프로세스를 다시 시작하지 않고 비즈니스 논리를 수정할 수 있습니다.AppDomain 격리 문제

불행하게도

지금까지 그렇게

이의 호스트 응용 프로그램 도메인 A를 부르 자 ... 좋은, 그리고 아이들 중 하나 B. 나는 B에 의해 참조되는 어셈블리 C에서 변경하는 경우 만 A가 아니라면 B가 다시로드 될 때 이러한 변경 사항이 반영되지 않습니다. 나는 A가 C 자체를로드하기 때문이라고 가정합니다. A가 C를로드하지 못하게하려면 어떤 단계를 밟아야합니까?

이것은 B를로드하는 데에 사용되는 코드입니다 :

 AppDomainSetup appDomainSetup = new AppDomainSetup(); 
     appDomainSetup.CachePath = ServiceDLLPath + @"\Shadow"; 
     appDomainSetup.ShadowCopyFiles = "true"; 

     ad = AppDomain.CreateDomain(assemblyName, null, appDomainSetup); 
     ad.InitializeLifetimeService(); 
     try 
     { 
      service = (IService)ad.CreateInstanceFromAndUnwrap(assemblyName, 
            "AppName.Services." + typeName); 
      service.Start(); 
     } 
     catch (Exception e) 
     { 
      LogManager.Log("AppDomain load failed: " + e.Message); 
      return false; 
     } 

답변

0

A 만약 참조 CA은 '호스트', 당신은 중지하고 프로세스를 다시 시작하지 않고 C를 다시로드 할 수 있습니다.

AppDomain을 부트 스트랩하여 (다시 시작할 수있는) 매우 얇은 shim AppDomain을 만들 수도 있지만 프로세스를 retsrating하면 아마 거의 동일한 성능 프로필이됩니다.

A과 그 종속성은 C에 의해 사용되는 것과 독립적이며, 겹치는 어셈블리는 매우 자주 변경하지 않아도 안정적으로 유지됩니다.

+0

Chris에게 감사드립니다. A는 C를 명시 적으로 참조하지 않지만 A는 C를 참조하는 B를 참조합니다. –

+0

A를 빌드하면 직접 참조되지 않는다는 사실에도 불구하고 C의 로컬 복사본이 생성되는 것을 볼 수 있습니다. 그래서 어셈블리의 재귀 검색이 있습니다. –

+0

참조는 암시 적으로 재귀 적입니다. A가 B를 참조하고 B가 C를 참조하면 A를로드하면 C가로드됩니다. –

0

좋아요. '인터페이스'어셈블리를 만들어 해결했습니다. 이 조립체는 X라고한다면

그래서, 체인은 이제 :

A -> X < - B -> C

(원래 : A -> B -> C)

appDomain B가 파괴되어 다시 Tim에 의해 요청 된 것처럼

EDIT에 의해 다시 반영되는 B 또는 C 중 하나를 변경할 수 있습니다.

appdomain A의 코드는 변경되지 않았습니다. 내 질문을 볼 수 있습니다. IService는 목적 내장 된 어셈블리에 이동 한 후

service = (IService)ad.CreateInstanceFromAndUnwrap(assemblyName, 
           "AppName.Services." + typeName); 

, 나는 어떤 방법이 결국에 연결하는 것을 B와 모두에 대한 참조를 제거 할 수 있었다 :주의가 필요한 유일한 것은 IService 유형 정의의 위치했다 A부터 C까지. Chris가 말한 모든 것이 정확합니다. 그것은 경로가 무엇인지 항상 명확하지는 않습니다.

+0

당신이 어떻게했는지에 대한 스 니펫을 보여줄까요? 적어도 글은 귀중한 답변 일 것이고 아마도 크레딧을받을 것입니다. :-) –

+0

변경 사항과 관련하여 표시 할 코드는 많지 않습니다. 업데이트 된 답변을 참조하십시오. 관심이 있다면 모니터링/재시작 코드를 공유 할 수 있습니다. Chris의 대답을 받아 들일 가능성이 가장 높습니다. –

0

대답과 의견을 읽으면 비즈니스 논리를 WCF 서비스로 래핑하는 것이 좋습니다. net pipe를 사용하면 동일한 PC에서 실행하는 오버 헤드를 최소화 할 수 있습니다. 또한 응용 프로그램 확장 성을 위해 MEF를 살펴 봐야합니다. 유감스럽게도 MEF는 호스트 응용 프로그램을 다시 시작하지 않고 즉시 플러그인을 언로드하고 바꿀 수 있도록 설계되지 않았습니다.

+0

내가 다시이 일을한다면 나는 그 길로 갈 것이다. Appdomains를 사용하여 로직을 동적으로로드하는 것이 문제가되지 않는다고 생각됩니다. 어떤 상황에서이 appdomain 접근법이 "서비스 당 하나의 프로세스 + WCF"보다 우수한 지 확신 할 수 없습니다. –