Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用反射时替换dll的新版本/修复_C#_.net - Fatal编程技术网

C# 使用反射时替换dll的新版本/修复

C# 使用反射时替换dll的新版本/修复,c#,.net,C#,.net,我们使用反射在wcf中创建了一个可扩展项目。 web服务在运行时根据输入请求加载不同的模块。 我们使用.NET反射动态加载模块库。 系统在IIS上运行 在测试过程中,我们注意到,一旦通过反射加载,就无法替换现有的DLL。我们试图将新的dll复制到bin目录中,但收到一个类似“应用程序使用的dll”的错误 我们可以保证只有我们的系统使用该dll。 但是,替换dll可能会停止IIS。 但是我们需要在不停止IIS的情况下替换dll。我们是否可以在代码级别处理这个问题 感谢您的快速回复 IOrder o

我们使用反射在wcf中创建了一个可扩展项目。 web服务在运行时根据输入请求加载不同的模块。 我们使用.NET反射动态加载模块库。 系统在IIS上运行

在测试过程中,我们注意到,一旦通过反射加载,就无法替换现有的DLL。我们试图将新的dll复制到bin目录中,但收到一个类似“应用程序使用的dll”的错误 我们可以保证只有我们的系统使用该dll。 但是,替换dll可能会停止IIS。 但是我们需要在不停止IIS的情况下替换dll。我们是否可以在代码级别处理这个问题

感谢您的快速回复

IOrder orderImpl = null;

try
{

string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\" + assemInfo.AssemblyQualifiedName + ".dll";
path = path.Replace("file:\\", "");
Assembly a = Assembly.LoadFile(path);

Type commandType = a.GetType(assemInfo.AssemblyQualifiedName + "." + assemInfo.ClassName);

orderImpl = (IOrder)commandType.GetConstructor(new System.Type[] { typeof(LocalOrderRequest) }).Invoke(new object[] { order });

}
catch (Exception ex)
{
throw new OrderImplException("-1", ex.Message);
}
谢谢
RSF

您可以尝试创建自己的AppDomain,然后从中加载/卸载程序集。这里有一篇关于这方面的文章:

您可以尝试创建自己的AppDomain,然后从那里加载/卸载程序集。这里有一篇关于这一点的文章:

我将从你的问题中做出两个假设:1)正常运行时间对你的应用程序至关重要,这就是为什么不能关闭30秒来更新它;2) 它不在容错、负载平衡的服务器场中

如果是这样,那么解决#2还将解决如何在不停机的情况下更新DLL的问题

对于一个不能关闭几秒钟来更新DLL的应用程序,您应该有一个支持所需稳定性的基础结构。意外停机的风险远远大于更新应用程序的影响

负载平衡器后面应该有多台服务器,如果其中一台服务器发生故障,负载平衡器将提供容错路由


通过这样做,您可以将故障停机的风险降至最低,并且可以通过关闭一个节点上的IIS,更新它,然后重新启动它来更新DLL。负载平衡将识别节点已停机,并将流量路由到良好节点,直到更新的节点再次可用。对其他节点重复此操作,您已在不停机的情况下更新了应用程序。

我将从您的问题中做出两个假设:1)正常运行时间对您的应用程序至关重要,因此无法关闭30秒进行更新;2) 它不在容错、负载平衡的服务器场中

如果是这样,那么解决#2还将解决如何在不停机的情况下更新DLL的问题

对于一个不能关闭几秒钟来更新DLL的应用程序,您应该有一个支持所需稳定性的基础结构。意外停机的风险远远大于更新应用程序的影响

负载平衡器后面应该有多台服务器,如果其中一台服务器发生故障,负载平衡器将提供容错路由

通过这样做,您可以将故障停机的风险降至最低,并且可以通过关闭一个节点上的IIS,更新它,然后重新启动它来更新DLL。负载平衡将识别节点已停机,并将流量路由到良好节点,直到更新的节点再次可用。对其他节点重复此操作,您已经更新了应用程序,并且没有停机