2011-05-09 39 views
0

我想開發一個Windows服務託管的wcf Web服務,該服務將充當任務執行管理和報告服務。每個任務將被表示爲.net程序集,任務名稱和dll路徑將處於中央配置中。該任務至少主要具有Execute和Stop方法。 當wcf服務正在運行並且其他任務正在運行時,應該可以加載,執行,停止和卸載任務。每個任務的一個實例可以同時運行。一個有異常的任務不應該放棄其他任務。我正在考慮像我如何動態加載和卸載WCF服務中的.Net程序集

[OperationContract]  
bool Load(string taskName); 
[OperationContract] 
bool Run(string taskName); 

我在想如何可以完成這個加載和卸載任務的需求以及隔離。一些選項將使用反射,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;