C#下反射动态加载dll后如何卸载?

简介: C#下反射动态加载dll后如何卸载?

最近在做项目的时候,遇到一个需求,需要通过选择的文件,先判断是C#dll还是C++dll,再判断dll是否是我们需要的特定dll,还是别的随便一个dll。

经过研究发现,我们可以通过反射来加载dll,如果用C#的反射机制可以正确加载dll,那么就可以认为该dll是C#类型的,如果不能正确加载,我们再通过C++的方法来加载进行判断。

判断是否特定dll的话,只需在判断完dll类型后,对dll中的特定类进行判断即可。

但是这里,存在一个问题,通过反射加载完C#dll后,该dll即被占用,无法进行修改(比如,我判断完该dll后,发现该dll版本选错了,那么此时,是没办法进行替换的,因为已经被程序加载了),此时,我们即需要对反射加载的该类进行卸载。

尴尬的是,C#并没有对Assembly定义释放方法,这是因为,反射加载完的对象是通过CLR进行托管的,只有等到对象无用时,才会通过GC进行回收。但这明显不能满足我们的需求。

其实,这个问题是可以通过应用程序域来解决的。

要对dll进行判断时,我们可以创建一个应用程序域,通过应用程序域的方法来动态加载反射,并且,其提供的UnLoad方法,可以将加载的dll给动态的卸载掉。

如,我这里是这么处理的。

            AppDomain appDomain = AppDomain.CreateDomain("CheckDllType");
            try
            {
                //判断文件存在不存在
                if (!File.Exists(dllPath))
                    return res;
                //用C#加载DLL的方法进行加载dll尝试
                object ob_CAN = appDomain.CreateComInstanceFrom(dllPath, "Unify.Bootloader");
                if (ob_CAN!=null)
                {
                    res = 1;
                    //释放对象
                    AppDomain.Unload(appDomain);
                    appDomain = null;
                    ob_CAN = null;
                }
            }
            catch (Exception ex)//若异常,则判断其他类型
            {
                //....
            }

注意,这里会把新创建域中的所有对象都给回收。

另外一个应用场景就是,当我们需要做一个反编译工具时,也需要用到这样的处理,因为不能每次dll更新后都重启反编译软件。

同时,这里创建域是有一组不同的方法的,并且每个方法都有多个重载,包括

CreateComInstanceFrom
CreateInstance
CreateInstanceAndUnwrap
CreateInstanceFrom
CreateInstanceFromAndUnwrap

有需要的大家可以自行学习,注意其间的区别。

相关文章
|
10月前
|
C#
C# 解决引用dll,出现dll不可以使用等问题
C# 解决引用dll,出现dll不可以使用等问题
|
3月前
|
程序员 C# 数据库
C# 比较对象新思路,利用反射技术打造更灵活的比较工具
中途接手的项目,碰到需要在更新对象信息时比较并记录差异的需求,最变态的还有附加要求,怎么办?有没有既能满足需求又能对项目影响最小的方法呢?分享这个我封装的方法,一个利用反射技术打造的更灵活的比较工具
|
5月前
|
C#
Delphi可不可以制作出像c#那样的dll类库?
在Delphi中,创建DLL项目(如dll.dpr)并定义一个类TMyCls后,在另一个项目(如test.dpr)中可以引入此DLL并直接实例化和调用类的方法。然而,Delphi目前主要支持两种DLL形式:动态链接库(需显式声明exports,仅支持函数调用)和ActiveX DLL(需定义IDL接口)。这两种方式都较为繁琐。相比之下,C# 的DLL类库更为便捷,编写并编译后即可在其他项目中直接使用。
|
7月前
|
C#
C# WPF 将第三方DLL嵌入 exe
C# WPF 将第三方DLL嵌入 exe
139 0
|
7月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
9月前
|
安全 编译器 API
程序与技术分享:C#调用DLL的几种方法
程序与技术分享:C#调用DLL的几种方法
380 0
|
9月前
|
机器学习/深度学习 开发框架 .NET
技术经验解读:【c#】反射真的很可怕吗?
技术经验解读:【c#】反射真的很可怕吗?
|
10月前
|
XML 缓存 算法
C#非强签名dll搜索顺序
C#非强签名dll搜索顺序
|
10月前
|
API C# 数据库
C#反射详解
C#反射详解
90 0
|
10月前
|
存储 C# 开发者
C# | 通过反射将对象属性展示在TreeView中
在编程过程中,我们经常需要处理复杂的对象和数据结构。将这些数据结构展示在UI界面上是很有用的,可以帮助开发者更好地理解和分析数据。 而TreeView作为一种常见的控件,可以以树状结构的方式展示数据,非常适合用于展示层次化的对象。 本文将介绍如何使用TreeView控件展示一个对象,并且可以动态处理对象中的属性和子对象。通过本文的学习,您将学会如何更好地理解和展示数据,提高编程效率。
91 0
C# | 通过反射将对象属性展示在TreeView中