当前位置:网站首页>C# 动态加载卸载 DLL
C# 动态加载卸载 DLL
2022-08-04 13:47:00 【林德熙】
我最近做的软件,需要检测dll或exe是否混淆,需要反射获得类名,这时发现,C#可以加载DLL,但不能卸载DLL。于是在网上找到一个方法,可以动态加载DLL,不使用时可以卸载。
我在写一个WPF 程序,发现可以通过 Assembly.Load
加载 DLL,但是如何卸载DLL?下面就来说下如何卸载。
看到 Assembly.Load
是把 DLL 加载到当前程序集,这句话,我就想到了我们的主程序集和当前的不同,那么可以加载到当前不会影响主程序。那么如何新建一个程序集?他是否可以卸载,答案是可以的。
首先,我们可以通过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,一会可以验证使用已经加载他。
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 。
边栏推荐
- 《社会企业开展应聘文职人员培训规范》团体标准在新华书店上架
- Programmer Qixi Gift - How to quickly build an exclusive chat room for your girlfriend in 30 minutes
- ssm learning experience (final chapter)
- GeoAO:一种快速的环境光遮蔽方案
- 2546 饭卡(01背包,挺好的)
- Install mysql on k8s
- MySQL性能指标TPS\QPS\IOPS如何压测?
- php中的ceil和floo以及round函数「建议收藏」
- Execution failed for task ‘:xxx:generateReleaseRFile‘.
- 节省50%成本!京东云重磅发布新一代混合CDN产品
猜你喜欢
电子行业MES管理系统有哪些特殊功能
面试官:如何查看/etc目录下包含abc字符串的文件?
节省50%成本!京东云重磅发布新一代混合CDN产品
《社会企业开展应聘文职人员培训规范》团体标准在新华书店上架
Win11快速助手在哪里?Win11打开快速助手的方法
LeetCode 1403 非递增顺序的最小子序列[贪心] HERODING的LeetCode之路
How to play the Tower of Hanoi
Is the code more messy?That's because you don't use Chain of Responsibility!
漏洞复现 - - - Alibaba Nacos权限认证绕过
MySQL性能指标TPS\QPS\IOPS如何压测?
随机推荐
Map common traversal methods - keySet and entrySet
PAT甲级:1040 Longest Symmetric String
如何通过使用“缓存”相关技术,解决“高并发”的业务场景案例?
将 Sentinel 熔断限流规则持久化到 Nacos 配置中心
State security organs conduct criminal arrest and summons review on Yang Zhiyuan, a suspect suspected of endangering national security
router---编程式导航
nVisual secondary development - Chapter 2 nVisual API operation guide Swagger use
《C 陷阱与缺陷 》阅读概要
第四讲 SVN
Utility function---string processing
Map常见的遍历方式-keySet 和 entrySet
正确使用Impala的invalidate metadata与refresh语句
FreeConfig.h文件
Win11勒索软件防护怎么打开?Win11安全中心勒索软件防护如何设置
VBS函数应用–getobject的使用获得Automation对象
TS---类型设置
【牛客刷题-SQL大厂面试真题】NO5.某宝店铺分析(电商模式)
零基础可以转行软件测试吗 ?这篇文章告诉你
AVR学习笔记之熔丝位
PMP每日一练 | 考试不迷路-8.4(包含敏捷+多选)