如何在WCF服务中动态加载和卸载.Net程序集

时间:2011-05-09 07:40:22

标签: c# wcf reflection maf

我想开发一个Windows服务托管的wcf Web服务,它将充当任务执行管理和报告服务。每个任务都将表示为.net程序集,任务名称和DLL路径将处于中央配置中。该任务至少主要有一个Execute和Stop方法。 在wcf服务运行且其他任务正在运行时,应该可以加载,执行,停止和卸载任务。每个任务的一个实例可以同时运行。具有异常的一个任务不应该中止其他任务。我正在考虑像

这样的方法
[OperationContract]    
bool Load(string taskName);
[OperationContract]
bool Run(string taskName);

我正在考虑如何按需完成此加载和卸载任务以及隔离。一些选项可能是使用Reflection,MAF(System.Addin)等。加载的初始性能可以接受,因为这种加载/卸载很少发生。

实现这一目标的最佳方式(库,API,框架等)是什么。

2 个答案:

答案 0 :(得分:1)

我不能说最好的,但唯一的(!)方法涉及多个应用程序域。因为您无法卸载程序集,只能卸载appdomain,因此属于任务的所有程序集都必须加载到单独的appdomain中。

这在技术上非常简单。魔鬼在细节。 MAF可能是一个很好的框架。

答案 1 :(得分: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;