【问题标题】:How to load DLL at runtime in C# app, invoke method, but then unload it?如何在 C# 应用程序中运行时加载 DLL,调用方法,然后卸载它?
【发布时间】:2020-07-18 11:11:49
【问题描述】:

我正在尝试使用某种“自动更新”应用程序。想法是拥有不可更改的代码,它将引用一个 DLL,所有逻辑都包含在 DLL 中。基本上,它将通过每 5 分钟查找一次更新来工作。如果有更新可用,则调用 dispose 方法,从 DLL 中处理所有内容,然后下载新的 DLL 并引用它,然后运行它的 start 方法。

我有这样的事情:

var DLL = Assembly.LoadFile(path_to_appdata+"dll_name.dll");

runner_dll = DLL.GetType("dll_namespace_name.Manager");
var c = Activator.CreateInstance(runner_dll);
var method = runner_dll.GetMethod("run_client");
method.Invoke(c, new object[] { });             

它有效。但是,问题是我无法更新 DLL,因为它正在使用中。我读过我不能直接从 Assembly 中删除它,但我可以将它加载到 AppDomain 中,然后卸载 AppDomain。但是,我已经尝试过,但似乎没有成功。

任何帮助将不胜感激。

【问题讨论】:

  • How to Load an Assembly to AppDomain with all references recursively?。但您可能更喜欢 AddIn(扩展),请参阅Managed Extensibility Framework (MEF)MAF 有点消失了。
  • 在这种情况下,也许多进程更好。您可以使用加载程序来控制更新,无论是 GUI 还是服务或后台 exe。 exe 使用 RPC 或管道相互通信。
  • @neohope 我想这就是我要做的。引用所有 DLL 太难了,但另一方面,可执行文件要容易得多。我将创建一个包含 DLL 的所有功能的控制台应用程序,从服务中运行它,然后它会在后台运行它应该做的事情。

标签: c# dll runtime appdomain


【解决方案1】:

我已经找到了答案,但这与引用 DLL 无关。我现在的解决方案是将所有内容捆绑在一个可执行文件中,然后从第一个应用程序启动它。第一个应用程序还将确保在必要时停止它并进行更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2016-11-02
    • 1970-01-01
    相关资源
    最近更新 更多