C#C# 动态加载卸载 DLL

本身多年来做的软件,须要检查测试dll或exe是不是混淆,须求反射得到类名,那时发现,C#能够加载DLL,但无法卸载DLL。于是在网上找到多少个形式,能够动态加载DLL,不使用时能够卸载。

自个儿在写三个WPF 程序,发现能够由此 Assembly.Load 加载
DLL,然则怎么卸载DLL?上边就来说下什么样卸载。

看到 Assembly.Load 是把 DLL
加载到当前程序集,那句话,小编就想到了小编们的主程序集和当前的不如,那么能够加载到方今不会潜移默化主程序。那么哪些新建3个先后集?他是或不是能够卸载,答案是足以的。

率先,我们得以透过var appDomain = AppDomain.CreateDomain(appDomainName);创设AppDomain 。他是能够卸载,卸载 AppDomain 使用 AppDomain.Unload
,就能够把加载在 AppDomain 的 DLL 卸载。

于是乎大家必要把 DLL 加载在 AppDomain ,那样未来能够卸载 AppDomain
动态删掉 加载的DLL。

如若要把 DLL 加载在 AppDomain 需求先写贰个类,继承MarshalByRefObject

    internal class ApplicationProxy : MarshalByRefObject
    {
        public void DoSomething()
        {

        }
    }

    var proxy =
                appDomain.CreateInstanceAndUnwrap(Assembly.GetAssembly(typeof(ApplicationProxy)).FullName,
                typeof(ApplicationProxy).ToString()) as ApplicationProxy;

大家得以在 DoSomething 函数加载 DLL ,加载的 DLL 在 AppDomain
,不在主程序,所以卸载 AppDomain 能够卸载 DLL

要是是从 文件加载,能够应用 LoadFile

                  var assembly  = Assembly.LoadFile(file.FullName);

assembly 能够博得全数的类和措施。

然后需求卸载时,能够行使AppDomain.Unload(appDomain);

建议写var assembly = Assembly.LoadFile(file.FullName);
try,写AppDomain.Unload(appDomain);在 finally

地点的 appDomainName 是自身要好给她的。

http://stackoverflow.com/questions/2132649/loading-unloading-assembly-in-different-appdomain

咱俩得以印证,假若不选择新建多个 AppDomain 加载的 DLL
会在主程序集,如若使用了,就会在我们新建的 AppDomain 。

先是我们采取 Assembly.LoadFile(file)
加载,再用反射得到当前程序集,然后拿走她的持有 type
,当然大家是明白加载的 File 包涵的 type,1会得以印证使用已经加载他。

            System.Reflection.Assembly.LoadFile(file);

            foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
            {
                //查看type               
            }

能够看来 file 包涵的 type 在主程序。

小编们利用新建 appDomain

              const string appDomainName = "ConfuseChecker";
            var appDomain = AppDomain.CreateDomain(appDomainName);
            var proxy =
                       appDomain.CreateInstanceAndUnwrap(Assembly.GetAssembly(typeof(ApplicationProxy)).FullName,
                           typeof(ApplicationProxy).ToString()) as ApplicationProxy;
            proxy.DoSomething(new FileInfo(file));

            AppDomain.Unload(appDomain);

那儿能够见到,大家的主程序未有包蕴 file 的 type 。

C# 1
本作品使用知识共享署名-非商业性利用-相同格局共享 肆.0
国际许可协议
开始展览许可。欢迎转发、使用、重新发表,但不能够不保留小说署名林德熙(包括链接:http://blog.csdn.net/lindexi_gd
),不得用于商业目标,基于本文修改后的著述必须以平等的特许公布。如有任何疑窦,请与本身联系

相关文章