一尘不染

热卸载/重新加载应用程序使用的DLL

c#

我有一个加载DLL来执行处理的特定部分的应用程序

Example : "Application.dll" loading "Process.dll"

Process.dll 使用反射 在运行时动态加载 ,并且未在应用程序中引用。

处理完成后,需要在服务器上重新编译DLL,然后稍后再次加载。
为此,我需要释放它,否则会收到以下消息:“无法将文件“ Process.dll”复制到“ Process.dll”。该进程无法访问文件“
Process.dll”,因为被另一个进程使用。”

因此,问题是:Process.dll在重新加载之前,如何以编程方式从我的应用程序中释放/释放/卸载它。当然,整个过程的重点是 停止应用程序。

编辑1:

提出的解决方案是这样的:

AppDomain newDomain4Process = AppDomain.CreateDomain("newDomain4Process");
Assembly processLibrary = newDomain4Process.Load("Process.dll");
AppDomain.Unload(newDomain4Process);

我仍然遇到的问题 是,尽管我给出了正确的完整路径,但还是得到了FileNotFound Exception这篇文章的答案也没有达到预期的效果。

编辑2:

这篇文章救了我的命,这是代码:

class ProxyDomain : MarshalByRefObject
    {
        public Assembly GetAssembly(string AssemblyPath)
        {
            try
            {
                return Assembly.LoadFrom(AssemblyPath);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }

   ProxyDomain pd = new ProxyDomain();
   Assembly a = pd.GetAssembly(FullDLLPath);

编辑3:
我没有访问AppDomain并通过以前的解决方案将其卸载。当我使用经典的AppDomain
Creation方法时,我感觉到Alexei的警告:AppDomain.Unload“似乎”可以正常工作,但程序集仍处于加载状态(“模块视图”)。因此,由于无法真正有效地卸载DLL,我仍然存在某种问题。


阅读 563

收藏
2020-05-19

共1个答案

一尘不染

自从我看了已经有一段时间了,但是我很确定您需要创建一个新的AppDomain,然后在其中加载DLL。

原因是您无法自行卸载Assembly,但可以卸载AppDomain包含的Assembly

这是一个CodeProject文章,描述了如何执行此操作:卸载正在运行的Dll

2020-05-19