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

本文关键字:加载 卸载 Net 程序集 动态 WCF 服务 | 更新日期: 2023-09-27 17:55:47

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

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

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

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

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

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

从技术上讲,这是非常微不足道的。细节决定成败。MAF可能是一个很好的框架。

我只想定义一个每个提供的程序集必须实现的接口。

我正在开发一个实现管道行为的项目,此代码片段可能对您有所帮助:它使用 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;