首页 / C# / C# 动态加载卸载 DLL
C# 动态加载卸载 DLL
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C# 动态加载卸载 DLL,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2962字,纯文字阅读大概需要5分钟。
内容图文
![C# 动态加载卸载 DLL](/upload/InfoBanner/zyjiaocheng/649/da7068231d9d4adcb72aad1398dcabe1.jpg)
我最近做的软件,需要检测dll或exe是否混淆,需要反射获得类名,这时发现,C#可以加载DLL,但不能卸载DLL。于是在网上找到一个方法,可以动态加载DLL,不使用时可以卸载。 我在写一个WPF 程序,发现可以通过 看到 首先,我们可以通过 于是我们需要把 DLL 加载在 AppDomain ,这样之后可以卸载 AppDomain 动态删掉 加载的DLL。 如果要把 DLL 加载在 AppDomain 需要先写一个类,继承 我们可以在 DoSomething 函数加载 DLL ,加载的 DLL 在 AppDomain ,不在主程序,所以卸载 AppDomain 可以卸载 DLL 假如是从 文件加载,可以使用 LoadFile assembly 可以获得所有的类和方法。 然后需要卸载时,可以使用 建议写 上面的 appDomainName 是我自己给他的。 http://stackoverflow.com/questions/2132649/loading-unloading-assembly-in-different-appdomain 我们可以验证,如果不使用新建一个 AppDomain 加载的 DLL 会在主程序集,如果使用了,就会在我们新建的 AppDomain 。 首先我们使用 可以看到 file 包含的 type 在主程序。 我们使用新建 appDomain 这时可以看到,我们的主程序没有包含 file 的 type 。
本文会经常更新,请阅读原文:
https://blog.lindexi.com/post/C-%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BD%E5%8D%B8%E8%BD%BD-DLL.html
,以避免陈旧错误知识的误导,同时有更好的阅读体验。
如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者前往 CSDN 关注我的主页
本作品采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:
https://blog.lindexi.com
),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请
与我联系
。
推荐关注 Edi.Wang 的公众号
Assembly.Load
加载 DLL,但是如何卸载DLL?下面就来说下如何卸载。Assembly.Load
是把 DLL 加载到当前程序集,这句话,我就想到了我们的主程序集和当前的不同,那么可以加载到当前不会影响主程序。那么如何新建一个程序集?他是否可以卸载,答案是可以的。var appDomain = AppDomain.CreateDomain(appDomainName);
创建 AppDomain 。他是可以卸载,卸载 AppDomain 使用 AppDomain.Unload
,就可以把加载在 AppDomain 的 DLL 卸载。MarshalByRefObject
internal class ApplicationProxy : MarshalByRefObject
{
public void DoSomething()
{
}
}
var proxy =
appDomain.CreateInstanceAndUnwrap(Assembly.GetAssembly(typeof(ApplicationProxy)).FullName,
typeof(ApplicationProxy).ToString()) as ApplicationProxy;
var assembly = Assembly.LoadFile(file.FullName);
AppDomain.Unload(appDomain);
var assembly = Assembly.LoadFile(file.FullName);
在 try,写 AppDomain.Unload(appDomain);
在 finallyAssembly.LoadFile(file)
加载,再用反射获得当前程序集,然后获取他的所有 type ,当然我们是知道加载的 File 包含的 type,一会可以验证使用已经加载他。 System.Reflection.Assembly.LoadFile(file);
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
//查看type
}
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);
以下是广告时间
内容总结
以上是互联网集市为您收集整理的C# 动态加载卸载 DLL全部内容,希望文章能够帮你解决C# 动态加载卸载 DLL所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。