0

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

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

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

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

4

2 回答 2

1

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

这在技术上是非常微不足道的。魔鬼在细节中。MAF 可能是一个很好的框架。

于 2011-05-09T08:09:01.097 回答
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;
于 2011-05-09T07:48:43.433 回答