代码之家  ›  专栏  ›  技术社区  ›  Cipi

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

  •  4
  • Cipi  · 技术社区  · 14 年前

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

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

    在一个线程中调用它,两次调用之间有一秒钟的睡眠时间。

    现在,我写了新版本:

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

    我可以在运行时用这个新的动态链接库更新旧的动态链接库吗?重要的是,我的应用程序一直在运行,没有米什么…但我想更新库是个例外。我错了吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   pete the pagan-gerbil    14 年前

    如果您的代码可以逻辑地隔离到单独的DLL中,那么您可以使用(如其他人提到的)远程处理或System.Addin框架。但是,根据功能的集成程度,它可能过于复杂和/或杀伤力过大。System.Addin方法的一个好处是,可以卸载程序集,用新版本替换dll,然后在不停止应用程序的情况下重新加载-但是,它仅为轻型插件架构设计,而且“隔离边界”的性能不会那么好。

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

    我想这一切归根结底都取决于你是否能够确定什么是可能改变的,以及是否有一个适合它的隔离过程。对整个应用程序进行此操作并不容易!

        2
  •  3
  •   Ian Ringrose    14 年前

    但是,您不能在DLL正在使用时更新它。

    • 用新文件名复制dll
    • 将dll的副本加载到应用程序域中
    • 使用.NET远程处理与该应用程序域对话
    • 当原始dll更改时,重复上述操作

    这就是ASP.NET在封面下所做的。所以另一个选择是使用aps.net来托管你的应用。