![](/img/trans.png)
[英]How can I dynamically read XML files in a folder without refreshing my app using 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.