繁体   English   中英

如何在不重新启动应用程序的情况下让我的C#应用​​程序的一部分动态加载?

[英]How can I get a portion of my C# app to load dynamically without app restart?

我的C#应用​​程序server.exe对我的业务运营至关重要,理想情况下,它需要24/7不间断运行。 该代码固若金汤,但我无法控制的是第三方生成的入站数据提要的质量很差。 我偶尔会收到包含异常的数据提要,在这种情况下,我必须:

  • 更新server.exe的提要处理代码以适应异常
  • 重新编译
  • 使用新代码重新启动server.exe并允许处理语法上有缺陷的提要

整个过程通常花费不到几分钟,但是server.exe的重新启动会导致某些非关键状态信息的重置,更糟糕的是,会导致依赖server.exe.的外部进程中断server.exe.

我的目标: 将提要处理代码隔离到一个单独的DLL中,无需重新启动server.exe即可更新其内容。 我该怎么做呢?

在撰写此论坛帖子之前,请允许我解释我到目前为止所做的事情:

提要处理器接口已移至名为common.dll的新程序集。 该界面如下所示:

public interface IFeedProcessor{
    bool ProcessFeed(String filePath);  //returns false on failure, true on success
}

Server.exe现在引用common.dll

提要处理器本身已移至名为feedProcessors.dll的新程序feedProcessors.dll 实现看起来像这样:

internal class FeedProcessor1:IFeedProcessor{
    public FeedProcessor1(){}
    bool ProcessFeed(String filePath){/*implementation*/return true;}
}

internal class FeedProcessor2:IFeedProcessor{
    public FeedProcessor2(){}
    public bool ProcessFeed(String filePath){/*implementation*/return true;}
}

[... and so on...]

feedProcessors.dll还包含一个名为FeedProcessorUtils的类,该类用于基于一些配置输入来创建特定的提要处理器。 看起来像这样:

public class FeedProcessorUtils{
    public static void CreateFeedProcessor(int feedType /*and other configuration params*/){
        switch(feedType){
            case 1:return new FeedProcessor1();
            case 2:return new FeedProcessor2();
            default: throw new ApplicationException("Unhandled feedType: "+feedType);
        }
    }
}

一切都像以前一样工作,但是当然不能解决我的动态加载问题; 如果我使用新代码更新feedProcessors.dll并将其复制到生产服务器,则由于文件正在使用中,因此无法执行此操作。 毫不奇怪。 那么解决方案是什么?

理想情况下,我希望能够将更新的feedProcessors.dll复制到生产服务器,而不会出现使用中文件错误并且无需重新启动server.exe 然后,下次server.exe调用FeedProcessorUtils.CreateFeedProcessor()时,它将从我修订的 DLL(而不是旧的DLL)中执行。

我从哪里开始?

您要对动态加载的DLL使用卷影复制程序集http://msdn.microsoft.com/zh-cn/library/ms404279(v=vs.110).aspx

听起来像是使用MEF的经典场所: http : //msdn.microsoft.com/zh-cn/library/dd460648( v= vs.110).aspx

我建议您调查一下并在继续进行时提问。

除了卷影复制选项,您还应该创建一个AppDomain并检查将dll更改为重新启动域并重新加载dll的时间 ,您可以使用FileSystemWatcher进行检查。

注意不要在AppDomains之间直接引用您的类 ,否则您的旧程序集将永远不会被卸载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM