【问题标题】:Dynamically un referenc a dll in c# winforms在 c# winforms 中动态取消引用 dll
【发布时间】:2013-11-12 02:46:47
【问题描述】:

我有一个 winform c# 应用程序。

我可以使用 [web 方法] 来检查我的客户端 winform 应该使用的 DLL 版本。我也可以下载。但是,如果我复制旧的 DLL,我会收到一条错误消息,指出该文件正在使用中。这是我预料到的。

有没有办法从我正在运行的 winform 应用程序中卸载这个 DLL,复制 DLL 并重新加载它?

我不想为我的更新程序使用引导程序,它可能不得不停止并重新启动我的应用程序。

如果我可以卸载我的 DLL,所有这些都将过时。

我找了很长时间,找不到任何东西。在我退休之前,我想我会在这里发布问题。

谢谢

PS 我可以发布显示如何在代码中加载 DLL 以及由此产生的错误的代码,但它是开放知识,不会添加到这个问题中。

【问题讨论】:

  • 您必须创建一个单独的 AppDomain 来容纳要加载/卸载的 .dll 文件。
  • 在应用程序域的生命周期内加载程序集。如果要动态更新,则必须将其加载到单独的应用程序域中。或者你可以通过创建一个新的 AppDomain 切换,在 appdomain 中启动你的更新程序,杀死主 appdomain。已更新执行相同但重新启动您的应用程序
  • 那么,您知道我的主应用程序在不同的应用程序域中引用 DLL 是否可行?这是你的建议吗?谢谢

标签: c# live-update


【解决方案1】:

有没有办法从我正在运行的 winform 应用程序中卸载这个 DLL,复制 DLL 并重新加载它?

在大多数情况下不会。在托管应用程序中卸载 DLL 的唯一方法是卸载整个 AppDomain。这通常意味着您需要非常小心地使用程序集(您不能直接引用并正常使用它)。

我不想为我的更新程序使用引导程序,它可能不得不停止并重新启动我的应用程序。

这是最常见的方法。在应用程序内部进行这项工作本质上是将引导程序构建到应用程序本身(在它自己的 AppDomain 中),并使用程序集卸载/重新启动 AppDomain。这通常需要更多的工作,并且与单独的引导程序应用程序一样具有破坏性。

【讨论】:

  • @AndrewSimpson 您无法在不停止应用程序的情况下有效地卸载进程/应用程序域。真的没有办法。
  • @AndrewSimpson 您必须将该程序集隔离在它自己的 AppDomain 中 - 取决于您从中使用的内容,这是可能的,但很棘手。查看 AppDomain 卸载以了解详细信息。
  • 我已经看到了在加载 DLL 之前对其进行影子复制的技术,这样可以覆盖原始文件,然后再进行影子复制+加载。这解决了文件锁定问题,但我不清楚之前加载的程序集版本会发生什么:stackoverflow.com/questions/13462525/…
  • @AndrewSimpson 也没有直接的“EVAL”支持。这将变得同样丑陋,因为大多数可以做任何复杂事情的实现都是动态编译,这会导致生成的程序集被加载。上面的影子复制方法也有同样的缺点——你可以继续加载新的程序集,但唯一的永远不会卸载,所以随着时间的推移,你会发生不好的事情......
  • @AndrewSimpson 除非您的逻辑可以在其自己的 AppDomain 中隔离,否则重启可能是最好的选择。 (如果你需要与你的程序交互,隔离是非常困难的,而不仅仅是“调用一些代码”)
【解决方案2】:

【讨论】:

  • 您好,非常感谢您的建议。我之前确实看过这个,但看不出这对我有什么帮助。不过感谢您的宝贵时间
猜你喜欢
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多