【问题标题】:How can I run multiple versions of code from a single windows service in .NET?如何在 .NET 中从单个 Windows 服务运行多个版本的代码?
【发布时间】:2011-03-13 21:12:46
【问题描述】:

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

【问题讨论】:

  • 您的问题找到解决方案了吗?
  • 我决定使用 System.AddIn 框架类,因为它可以巧妙地处理使用同一程序集的不同版本。我在创建 AppDomain 并尝试将程序集及其依赖项加载到正确的上下文中时遇到了麻烦。
  • 太好了,我需要调查一下。我不知道它在那里。 =)

标签: .net asp.net windows-services


【解决方案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);
}

【讨论】:

  • 这很好,直到我不得不开始将程序集加载到其他应用程序域中。我检查了 MEF,但 MAF 似乎更适合我的情况。参考link
【解决方案2】:

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

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

【讨论】:

  • 我想我可以提供一些像 AS-CII 这样的样板代码,但 Google 上已经有很多了。
猜你喜欢
  • 2013-02-09
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多