我们有一个企业ASP.NET / VB.NET应用程序,它有多个客户端在产品代码的不同版本(网站)上运行。
我正在尝试创建一个在我们的服务器上运行的Windows服务来执行长时间运行的任务。此服务需要为每个客户端运行正确版本的代码,我最初考虑过调用将作为Web版本的一部分进行部署的WCF服务。
问题是我们的IIS池每晚都会循环使用,这可能会导致作业中止。一份超过24小时的工作永远不会有机会完成。
我们的服务器运行的是Windows Server 2003,IIS 6.0,.NET Framework 3.5,SQL Server 2005。
有没有办法动态加载程序集而无需重新启动服务?
修改:我最终使用了此step by step example
中详细介绍的System.AddIn答案 0 :(得分:1)
有没有办法加载程序集动态以使用而不必重启服务?
是的,有。我想你有一个或多个类型必须实例化。如果是这种情况,请考虑使用以下内容:
object instance = Activator.CreateInstance("MyAssembly.dll", "MyType");
instance.GetType().InvokeMethod(etc);
如果您在.NET Framework 4.0下运行,则可以使用DLR:
dynamic instance = Activator.CreateInstance("MyAssembly.dll", "MyType");
instance.MyMethod();
编辑:或者您可以查看MEF(它是.NET Framework 4.0的一部分)。
MEF为运行时可扩展性问题提供了一个简单的解决方案。
基本上(我简化了很多)你可以指定必须选择哪个文件夹来接收程序集,然后MEF将自动实例化对象,例如,共享相同的接口
共享界面:
public interface IPlugin
{
void ExecuteTask();
}
插件(外部装配):
[Export(typeof(IPlugin)]
public class Plugin1 : IPlugin
{
public void ExecuteTask()
{
// Do something
}
}
主要应用:
[Import]
private IPlugin plugin;
// Somewhere else
private void Initialize()
{
var directory = new DirectoryCatalog("myDir");
var container = new CompositionContainer(directory);
container.ComposeParts(this);
}
答案 1 :(得分:0)
有没有办法加载程序集 动态地使用而不必 重启服务?
也许你可以为你的服务设计一个插件架构,然后加载不同的插件来执行不同的任务。