码迷,mamicode.com
首页 > 移动开发 > 详细

使用AppDomain进行动态加载和卸载dll

时间:2019-03-18 13:52:30      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:ref   不可   new   proxy   class   ica   简单   str   tor   

加载dll最简单的写法

Assembly.Load("<dll路径>")

  

但这样写这个dll就被程序占用不可删除,即不可以卸载。

 

通过AppDomain加代理的方式进行加载则可以实现卸载,从而实现程序不被占用并被删除。

 

第一步,创建AssemblyProxy类

public class AssemblyProxy : MarshalByRefObject
{
        private Assembly assembly;

        public void LoadAssembly(string fullName)
        {
            assembly = Assembly.LoadFrom(fullName);
        }/// <summary>
        /// 开放委托,可使用Assembly操作
        /// </summary>
        /// <param name="action"></param>
        public T Work<T>(Func<Assembly, T> action)
        {
            return action.Invoke(assembly);
        }
}

 

AssemblyProxy类将运行在子AppDomain中,通过操作AssemblyProxy类进行反射加载的DLL。保证AppDomain.CurrentDomain和子AppDomain隔离,最后卸载子AppDomain就实现了动态加载和卸载dll的目标。

 

第二步,实现AssemblyLoader类

 

public class AssemblyLoader
{
        private AppDomain appDomain;

        public AssemblyProxy Proxy;

        public AssemblyLoader()
        {
            AppDomainSetup setup = new AppDomainSetup();
            setup.ApplicationName = "Child";
            setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
            setup.PrivateBinPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "private");
            setup.CachePath = setup.ApplicationBase;
            setup.ShadowCopyFiles = "true";
            setup.ShadowCopyDirectories = setup.ApplicationBase;

            appDomain = AppDomain.CreateDomain("ChildDomain", null, setup);
            string name = Assembly.GetExecutingAssembly().GetName().FullName;

       // 从子类AppDomain中反射创建AssemblyProxys实例 Proxy
= (AssemblyProxy)appDomain.CreateInstanceAndUnwrap(name, typeof(AssemblyProxy).FullName); } public void LoadAssembly(string fullName) { Proxy.LoadAssembly(fullName); } public void Unload() { AppDomain.Unload(appDomain); appDomain = null; } }

 

接着就可以使用了

 

var loader = new AssemblyLoader();
loader.LoadAssembly(path);

var version = loader.Proxy.Work(assembly =>
{
     return assembly.GetName().Version.ToString();
});

loader.Unload();

 

使用AppDomain进行动态加载和卸载dll

标签:ref   不可   new   proxy   class   ica   简单   str   tor   

原文地址:https://www.cnblogs.com/saving/p/10551441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!