2011-05-09 6 views
0

작업 실행 관리 및보고 서비스로 작동하는 Windows 서비스 호스팅 wcf 웹 서비스를 개발하고 싶습니다. 각 작업은 .net 어셈블리로 표시되며 작업 이름과 dll 경로는 중앙 구성에 있습니다. 작업은 주로 Execute와 Stop 메서드를 가지고 있습니다. wcf 서비스가 실행 중이고 다른 작업이 실행 중일 때 작업로드, 실행, 중지 및 언로드가 가능해야합니다. 각 작업의 한 인스턴스가 동시에 실행될 수 있습니다. 예외가있는 한 태스크가 다른 태스크를 중단해서는 안됩니다.WCF 서비스에서 .Net 어셈블리를 동적으로로드 및 언로드 할 수있는 방법

이로드 및 언로드 작업을 분리 및 분리 할 수있는 방법을 생각하고 있습니다. 일부 옵션은 Reflection, MAF (System.Addin) 등을 사용합니다.이로드/언로드가 매우 드물게 발생하므로 초기 성능로드가 적합합니다.

이 목표를 달성하는 가장 좋은 방법 (라이브러리, API, 프레임 워크 등)은 무엇입니까?

답변

1

내가 가장에 대해 말할 수 없다 도움이되기를 바랍니다 -

나는이 필요하시면 정확히 아니라고 감사, 그러나 희망이 올바른 방향을 알려줄거야 그러나 유일한 (!) 접근 방식은 바로 appdomains를 포함합니다. 어셈블리를 언로드 할 수 없으므로 appdomain 만 있으므로 작업에 속한 모든 어셈블리를 별도의 appdomain에로드해야합니다.

이것은 기술적으로 매우 간단합니다. 악마는 세부 사항에 있습니다. MAF는이를위한 훌륭한 틀이 될 수 있습니다.

0

제공된 각 어셈블리가 구현해야하는 인터페이스를 정의합니다.

파이프 라인 동작을 구현하는 프로젝트에서 작업하고 있습니다.이 코드 조각은 도움이 될 수 있습니다. linq을 사용하여로드 된 모든 어셈블리를 검색하여 특정 인터페이스를 구현하고 빈 생성자 및 사용자 지정 클래스를 구현하는 클래스를 찾습니다. 속성 (사용자 정의 속성 부분은 필요하지 않음) - 발견 된 각 항목의 인스턴스를 인스턴스화합니다. 그것은 :)

 var processingModules = from mod in 
            AppDomain.CurrentDomain.GetAssemblies().SelectMany(assembly => 
            { 

             return from t in assembly.GetTypes() 

               where 
                t.GetInterfaces().Contains(typeof(IProcessingModule<T>)) 
                && t.GetConstructor(Type.EmptyTypes) != null 
                && t.GetCustomAttributes(typeof(ProcessModuleAttribute), true) 
                  .Cast<ProcessModuleAttribute>() 
                  .Select(e => e.Processes.Contains(manager.Name)) 
                  .Contains(true) 

               select Activator.CreateInstance(t) as IProcessingModule<T>; 
            }) 
            orderby mod.ModuleOrder 
             select mod;