【发布时间】: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 的所有功能的控制台应用程序,从服务中运行它,然后它会在后台运行它应该做的事情。