C# 使用反射时替换dll的新版本/修复
我们使用反射在wcf中创建了一个可扩展项目。 web服务在运行时根据输入请求加载不同的模块。 我们使用.NET反射动态加载模块库。 系统在IIS上运行 在测试过程中,我们注意到,一旦通过反射加载,就无法替换现有的DLL。我们试图将新的dll复制到bin目录中,但收到一个类似“应用程序使用的dll”的错误 我们可以保证只有我们的系统使用该dll。 但是,替换dll可能会停止IIS。 但是我们需要在不停止IIS的情况下替换dll。我们是否可以在代码级别处理这个问题 感谢您的快速回复C# 使用反射时替换dll的新版本/修复,c#,.net,C#,.net,我们使用反射在wcf中创建了一个可扩展项目。 web服务在运行时根据输入请求加载不同的模块。 我们使用.NET反射动态加载模块库。 系统在IIS上运行 在测试过程中,我们注意到,一旦通过反射加载,就无法替换现有的DLL。我们试图将新的dll复制到bin目录中,但收到一个类似“应用程序使用的dll”的错误 我们可以保证只有我们的系统使用该dll。 但是,替换dll可能会停止IIS。 但是我们需要在不停止IIS的情况下替换dll。我们是否可以在代码级别处理这个问题 感谢您的快速回复 IOrder o
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。负载平衡将识别节点已停机,并将流量路由到良好节点,直到更新的节点再次可用。对其他节点重复此操作,您已经更新了应用程序,并且没有停机