在运行时更新应用程序的库(DLL)?

时间:2010-09-27 12:24:57

标签: c# dll

当应用程序在C#中运行时,有没有办法更新DLL?例如,如果存在具有如下函数的DLL:

void write()
{
    Console.WriteLine("LALALA");
}

在一个线程中调用它,在两次调用之间休眠1秒钟。

现在,我写了新版本:

void write()
{
    Console.WriteLine("LA LA LA\n");
}

我可以在运行时使用这个新DLL更新旧的DLL吗?重要的是我的APP一直在运行,没有什么......但我想更新库是个例外。我错了吗?

2 个答案:

答案 0 :(得分:3)

您无法在使用时更新dll。但是您可以。

  • 使用新文件名
  • 制作dll的副本
  • 将dll的副本加载到应用程序域
  • 使用.net remoting与该应用域对话
  • 原始dll更改时重复上述

这就是Asp.net所做的事情。所以另一种选择是使用Aps.net来托管你的应用程序。

答案 1 :(得分:3)

如果您的代码可以在逻辑上隔离成单独的DLL,您可以使用(如其他人所提到的)远程处理或System.AddIn框架。根据功能的集成程度,可能过于复杂和/或过度杀伤。 System.AddIn方法的一个好处是可以卸载程序集,用新版本替换dll,并在不停止应用程序的情况下重新加载 - 它仅用于轻量级插件体系结构,并且跨越“隔离边界”的性能不是不会那么好。

如果区域足够小(例如http://www.ironpython.net/),脚本也可能很有用 - 您可以将代码存储在文本文件(或数据库,或任何地方)中,然后从那里加载/运行它。然后只需替换代码并重新加载它。

我想这一切都取决于你是否能够确定可能会发生什么变化,以及是否存在适合它的隔离过程。要完成整个应用程序并不容易!