使用反射时将新版本/修复程序替换为dll

时间:2012-09-14 11:59:00

标签: c# .net

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

在我们的测试中,我们注意到一旦通过Reflection加载,我们就无法替换现有的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

2 个答案:

答案 0 :(得分:0)

您可以尝试创建自己的AppDomain,然后从那里加载/卸载程序集。这是一篇关于它的文章:http://people.oregonstate.edu/~reeset/blog/archives/466

答案 1 :(得分:0)

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

如果是这种情况,那么解决#2也将解决如何在没有停机的情况下更新DLL。

对于无法关闭几秒钟以更新DLL的应用程序,您应该拥有支持所需稳定性的基础架构。意外中断的风险远远大于更新应用程序的影响。

如果其中一台服务器出现故障,那么在负载均衡器后面应该有多台服务器可以提供容错路由。

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