c#动态加载卸载DLL的方法

这篇文章介绍了c#动态加载卸载DLL的方法,有需要的朋友可以参考一下c#中通过反射可以方便的动态加载dll程序集,但是如果你需要对dll进行更新,却发现.net类库没有提供卸载dll程序集的方法。在

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

这篇文章介绍了c#动态加载卸载DLL的方法,有需要的朋友可以参考一下

c#中通过反射可以方便的动态加载dll程序集,但是如果你需要对dll进行更新,却发现.net类库没有提供卸载dll程序集的方法。在.net 中,加入了应用程序域的概念,应用程序域是可以卸载的。也就是说,如果需要对动态加载的dll程序集进行更新,可以通过以下方法解决:

新建一个应用程序域,在该应用程序域中动态加载DLL,然后可以卸载掉该应用程序域。该应用程序域被卸载的时候,相关资源也会被回收。

要想这样实现,就要让你程序的currentDomain和新建的newDomain之间进行通信,穿过应用程序域的边界。从网上找到了某大牛的解决方法,抄下来留给自己看吧: 

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Threading; 
using System.Reflection; 
namespace UnloadDll 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            string callingDomainName = AppDomain.CurrentDomain.FriendlyName;//Thread.GetDomain().FriendlyName; 
            Console.WriteLine(callingDomainName); 
            AppDomain ad = AppDomain.CreateDomain("DLL Unload test"); 
            ProxyObject obj = (ProxyObject)ad.CreateInstanceFromAndUnwrap(@"UnloadDll.exe", "UnloadDll.ProxyObject"); 
            obj.LoadAssembly(); 
            obj.Invoke("TestDll.Class1", "Test", "It's a test"); 
            AppDomain.Unload(ad); 
            obj = null; 
            Console.ReadLine(); 
        } 
    } 
    class ProxyObject : MarshalByRefObject 
    { 
        Assembly assembly = null; 
        public void LoadAssembly() 
        { 
            assembly = Assembly.LoadFile(@"TestDLL.dll");            
        } 
        public bool Invoke(string fullClassName, string methodName, params Object[] args) 
        { 
            if(assembly == null) 
                return false; 
            Type tp = assembly.GetType(fullClassName); 
            if (tp == null) 
                return false; 
            MethodInfo method = tp.GetMethod(methodName); 
            if (method == null) 
                return false; 
            Object obj = Activator.CreateInstance(tp); 
            method.Invoke(obj, args); 
            return true;            
        } 
    } /* 何问起 hovertree.com */
} 

注意:

 

1. 要想让一个对象能够穿过AppDomain边界,必须要继承MarshalByRefObject类,否则无法被其他AppDomain使用。

2. 每个线程都有一个默认的AppDomain,可以通过Thread.GetDomain()来得到

推荐:

http://hovertree.com/h/bjaf/scjyuanma.htm

http://www.cnblogs.com/roucheng/p/netkuangjia.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120322.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java并发框架_java常用并发框架

    java并发框架_java常用并发框架java并发框架Fork/Join

  • Jsp中EL表达式不解析问题

    Jsp中EL表达式不解析问题记一次很郁闷的Bug         前一天晚上写好的JSP页面,然后发布在Tomcat上面之后,一切正常。第二天早上打开之后,发现css样式始终加载不出来,刚开始以为网速问题(前一天晚上测试一切正常,因此排除代码问题),测试网络一切正常,这就跟尴尬了,那css加载不出来是什么意思,难不成遇见鬼了?于是在发布后的页面检查代码,发现页面没有解析EL表达式,找到问题就想办法解决,于是开始折腾,最终还是…

  • CardView_Cardio

    CardView_Cardio转自:http://blog.csdn.net/u010498248/article/details/52524053CardView是Android5.0系统引入的控件,相当于FragmentLayout布局控件然后添加圆角及阴影的效果;CardView被包装为一种布局,并且经常在ListView和RecyclerView的Item布局中,作为一种容器使用。CardView应该被使

    2022年10月11日
  • 开启QQ登录保护仍被盗号——QQ安全机制全面分析[通俗易懂]

    开启QQ登录保护仍被盗号——QQ安全机制全面分析[通俗易懂]1、前言周围总是有些同学QQ被盗号,攻击者盗取账号后会继续去欺骗列表里的好友,形成链式反应。危害比较大。腾讯QQ安全中心提供了登录保护机制,如图:  这是腾讯为QQ添加第二层保护,在开启登录保护后,盗号者偷走密码的情况下QQ仍然安全。即使你的账号密码不小心泄露了,盗号者仍旧无法登录你的QQ。  但是,有位同学在开启QQ登录保护的情况下依然被盗号者登录成功了。QQ登录保护的安全机制:当我们开启了“登录保护”,盗号者登录QQ输入正确的密码,即使更换IP骗过了安全检测系统,会发现仍然需要

  • oracle 创建用户命令

    oracle 创建用户命令–创建用户testuser密码123456createusertestuseridentifiedby123456;grantresource,connecttotestuser;grantselectanydictionarytotestuser;grantselectanysequencetotestuser;grantsel…

  • Java集合容器面试题(2020最新版)「建议收藏」

    Java集合容器面试题(2020最新版)「建议收藏」文章目录集合容器概述什么是集合集合的特点集合和数组的区别使用集合框架的好处常用的集合类有哪些?List,Set,Map三者的区别?List、Set、Map是否继承自Collection接口?List、Map、Set三个接口存取元素时,各有什么特点?集合框架底层数据结构哪些集合类是线程安全的?Java集合的快速失败机制“fail-fast”?怎么确保一个集合不能被修改?Collection…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号