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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HTTPS实现及安全方面

    HTTPS实现及安全方面

    2022年2月13日
    36
  • micropython教程_md转word

    micropython教程_md转word之前的博客格式不太完美,所以我学习了一下MD编译器相关操作,并把常用的操作总结在这篇博客里面,希望大家可以学习一下,来美观自己的博客

    2022年9月24日
    3
  • Ubuntu安装配置MySQL_nginx upstream

    Ubuntu安装配置MySQL_nginx upstream系Ubuntu安装配置nginx提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系Ubuntu安装配置nginx前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。

    2022年9月18日
    2
  • 简述MD5加密[通俗易懂]

    简述MD5加密[通俗易懂]MD5加密publicclassMD5{ /**四个链接变量标准幻数(按大端字节序存储-高位字节排放在内存的低地址端(即该值的起始地址),低位字节排放在内存的高地址端)*/privatefinalintA=0x67452301;//01234567privatefinalintB=0xefcdab89;//89abcdef…

    2022年7月11日
    21
  • CentOS 7安装和简单配置ss5

    CentOS 7安装和简单配置ss5系统及软件 centos764 位 3 10 0ss5 3 8 9 8 安装编译环境 yum yinstallgcca 安装依赖 yum yinstallpam developenlda develcyrus sasl developenssl devel 解压源码包 tar xvfss5 x x x x tar gz 进入解压后的目录 依次执行 自动配

    2025年6月10日
    1
  • 令人作呕的OpenSSL

    令人作呕的OpenSSL

    2021年12月14日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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