`
lindexi-gd
  • 浏览: 139583 次
社区版块
存档分类
最新评论

C# 动态加载卸载 DLL

 
阅读更多

我最近做的软件,需要检测dll或exe是否混淆,需要反射获得类名,这时发现,C#可以加载DLL,但不能卸载DLL。于是在网上找到一个方法,可以动态加载DLL,不使用时可以卸载。

<!--more-->

我在写一个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 。

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    C#中动态加载和卸载DLL

    在C#编程中,动态加载和卸载DLL是常见的需求,特别是在处理插件系统或需要在运行时替换组件的情况下。通常,C++使用LoadLibrary和FreeLibrary函数来完成这一任务,但C#的设计有所不同,它依赖于.NET框架的垃圾回收...

    C#中加载和卸载DLL

    而在C#中,虽然可以通过`Assembly.LoadFile`方法来动态加载DLL,但是在卸载DLL方面却没有直接对应的方法,这是因为C#采用了垃圾回收机制。 #### 二、C#中的DLL加载与卸载 ##### 2.1 动态加载DLL 在C#中,可以使用`...

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

    在C#编程中,动态加载和卸载DLL是常见的需求,特别是在需要热更新或模块化设计的应用程序中。本文将详细介绍如何在C#中实现这一功能,主要涉及`AppDomain`和反射机制。 首先,动态加载DLL主要依赖于C#的`Reflection...

    利用反射,动态加载DLL,卸载DLL

    本篇将深入探讨如何利用反射动态加载和卸载DLL,以及在实际应用中的场景。 首先,我们需要了解DLL(动态链接库)在Windows操作系统中的作用。DLL文件是一组可重用的函数和数据,多个应用程序可以共享它们,以减少...

    c# 实现动态加载c++ dll 动态库

    c# 实现动态加载c++ dll 动态库 本示例提供动态加载 卸载c++ dll动态库 所用工具 : visual studio ; 系统:Windows

    C#动态加载DLL主要说明如何通过反射实现动态加载DLL

    3. 自动垃圾回收(Garbage Collection):.NET框架提供了一种自动回收不再使用的内存机制,因此在加载和卸载DLL时,不需要特别处理内存释放问题。 4. `Assembly.LoadFile`与`Assembly.LoadFrom`的区别:`LoadFile`...

    c# 动态加载dll文件,并实现调用其中的方法(推荐)

    在动态加载DLL时,可以为每个加载的DLL创建不同的应用程序域,这样可以在卸载DLL时释放资源。 总之,C#动态加载DLL并调用其方法是.NET应用程序中常用的技术,特别是在需要模块化和扩展性时。通过上述步骤和相关类的...

    C#动态加载DLL的DEMO

    在.NET框架中,C#语言提供了强大的动态类型和运行时代码执行能力,使得开发者能够在程序运行过程中动态加载和使用DLL(动态链接库)文件。这个DEMO主要展示了如何利用C#来实现DLL的动态加载,这在很多场景下非常有用...

    AutoCAD二次开发(C#)完成后,如何实现CAD启动时自动加载dll(不必输入netload)?

    在AutoCAD的二次开发过程中,使用C#语言创建的动态链接库(DLL)通常需要通过命令行`netload`来手动加载。然而,为了提升用户体验并实现自动化,我们需要让CAD在启动时自动加载这些DLL。这涉及到AutoCAD的启动脚本、...

    DotNet平台DLL动态加载示例

    本文将详细讨论在C#中如何实现DLL动态加载,并结合“DotNet平台DLL动态加载示例”中的问题进行分析。 1. **什么是DLL动态加载?** DLL动态加载是指程序在运行时通过API调用来加载和卸载DLL,而不是在编译时将其...

    C#将引用的dll嵌入到exe文件中

    在C#编程中,有时我们需要将引用的DLL文件与主执行...请注意,这种方法仅适用于那些不需要在运行时动态加载或卸载的DLL。对于需要动态加载的库,可能需要使用其他技术,如.NET Framework的延迟加载特性或使用第三方库。

    C#实现DLL热插拔

    在.NET框架中,C#提供了一种机制,允许开发者实现DLL的热插拔,即在应用程序运行时动态加载和卸载DLL,而无需重启整个进程。这种功能主要通过`System.AppDomain`类来实现,它代表了.NET应用程序的一个独立执行环境。...

    C#动态调用Dll的研究

    总之,C#中的DLL动态调用提供了灵活性和效率,允许程序员根据需求选择加载和使用DLL的方式,同时也需要注意性能优化和安全问题。无论是静态调用还是动态调用,了解和掌握DLL调用机制对于提升C#应用程序的功能和性能...

    C语言通过动态加载DLL实现调用JLink功能.zip

    4. 卸载DLL:在不再需要DLL时,使用`FreeLibrary`函数卸载它,释放资源。 ```c FreeLibrary(hModule); ``` JLinkDll-master文件夹很可能包含了JLinkDLL的源代码或编译好的库,供开发者参考学习如何构建和使用这样的...

    基于WPF开发的插件式DLL动态加载源码,使用反射方式实现,可以直接当作模板使用.zip

    本资源是一个关于如何在WPF应用中实现插件式DLL动态加载的示例,使用了反射这一强大的特性。 首先,让我们了解什么是插件架构。插件架构是一种软件设计模式,允许主应用程序在运行时动态地发现和加载外部组件,即...

    wince注册表操作(创建加载卸载驱动)

    本文将详细讲解如何在WinCE 5.0中使用C#进行注册表操作,包括创建、加载和卸载DLL驱动。首先,我们需要理解WinCE注册表的基本结构,它分为几个主要部分:HKEY_LOCAL_MACHINE、HKEY_CURRENT_USER等,与桌面版Windows...

    利用反射动态加载dll

    总的来说,利用反射动态加载DLL是C#中的高级技巧,它可以极大地提高代码的灵活性,特别是在处理插件系统、热更新或者需要在运行时根据外部条件加载不同功能的情况下。但同时也需要注意其潜在的性能影响,因为反射...

    C# 动态链接机制 插件平台

    利用`AppDomain`,我们可以动态加载和卸载DLL,避免对主程序造成影响。 1. **动态加载DLL**: 在C#中,我们通常使用`Assembly.Load`或`Assembly.LoadFrom`方法来动态加载DLL。这两个方法接受DLL的路径作为参数,...

Global site tag (gtag.js) - Google Analytics