如何从.NET中的单个Windows服务运行多个版本的代码?

时间:2011-03-13 21:12:46

标签: .net asp.net windows-services

我们有一个企业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

2 个答案:

答案 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)

  

有没有办法加载程序集   动态地使用而不必   重启服务?

也许你可以为你的服务设计一个插件架构,然后加载不同的插件来执行不同的任务。