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

乍得·德克尔

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

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

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

我的目标是:将提要处理代码隔离到一个单独的DLL中,该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实现看起来像这样:

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使用卷影复制程序集http://msdn.microsoft.com/zh-cn/library/ms404279(v=vs.110).aspx

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不重新启动应用程序的情况下重新配置Serilog?

Azure:如何在不重新启动应用程序服务的情况下重新加载环境变量

如何在不重新启动应用程序的情况下获取StackOverflowError的完整stacktrace

德尔福7。如何在不重新启动应用程序的情况下卸载dll?

如何在不重新启动应用程序的情况下更改Flutter应用程序的语言?

如何在不重新启动应用程序的情况下在WPF中重新加载ViewModel?

如何在不重新启动或停止应用程序的情况下重置infinispan统计信息

如何在不重新启动 JVM 的情况下将外部 JAR 添加到 Spring 应用程序?

如何在不重新启动应用程序的情况下激活运行时登录?

是否可以在不重新启动应用程序的情况下重新加载WebSphere Application Server(WAS)中的共享库?

如何在不重新加载整个应用程序的情况下获取异步数据

如何在不重新加载整个站点的情况下替换站点的一部分?

在不重新启动应用程序的情况下将本机应用程序LTR响应RTL更改

在不重新启动应用程序的情况下更新SQLite数据库

Spring Boot-在不重新启动应用程序的情况下更新ResourceHandlerRegistry

在给定窗口句柄的情况下,如何确定窗口句柄是否是Windows UI而不是应用程序的一部分?

如何在React应用程序中仅加载Redux存储的一部分

如何在Azure上编写应用程序的一部分?

XCTest UI测试-如何在不重新启动的情况下关闭和打开应用程序?

是否可以在不重新启动某些进程类型的情况下重新部署Heroku应用程序

是否可以在不重新启动应用程序的情况下对 Azure Web App 执行配置更改?

如何覆盖“应用程序管道的一部分”内部名称?

如何在AngularJS应用程序中解码URL的查询字符串的一部分?

如何在余烬应用程序中将api密钥作为url的一部分传递

如何在没有任何页面过渡或任何重新启动应用程序的情况下使用一种方法

作为JPackage安装的一部分,我如何在linux中使本机linux应用程序可执行

(C# Windows 窗体应用程序)如何重新启动应用程序

Firestore不会在不重新加载应用程序的情况下更新SwiftUI网格

应用程序层协议是系统实用程序的一部分吗?