2

我们使用反射在 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);
}

感谢无国界医生

4

2 回答 2

0

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

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

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

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

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

于 2012-09-14T12:07:32.997 回答
0

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

于 2012-09-14T12:06:00.567 回答