`

C#中动态加载和卸载DLL

    博客分类:
  • C#
 
阅读更多
在C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方卸载。在C#中我们也能使用Assembly.LoadFile实现动态加载DLL,但是当你试图卸载时,你会很惊讶的发现Assembly没有提供任何卸载的方法。这是由于托管代码的自动垃圾回收机制会做这件事情,所以C#不提供释放资源的函数,一切由垃圾回收来做。
当AppDomain被卸载的时候,在该环境中的所有资源也将被回收。关于AppDomain的详细资料参考MSDN。下面是使用AppDomain实现动态卸载DLL的代码,


namespace MyDemo.Context
{
    class UnloadDll
    {
        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(@"MyDemo.exe", "MyDemo.Context.ProxyObject");
            obj.LoadAssembly();
            obj.Invoke("Model.Person", "GetByID", 100);
            AppDomain.Unload(ad);
            obj = null;
            Console.ReadLine();
        }
    }
    class ProxyObject : MarshalByRefObject
    {
        Assembly assembly = null;
        public void LoadAssembly()
        {
            string file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Model.dll");
            assembly = Assembly.LoadFile(file);
        }
        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;
        }
    }
}
分享到:
评论

相关推荐

    C#中加载和卸载DLL

    如题如题如题如题如题如题如题如题如题如题如题如题

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

    c#中通过反射可以方便的动态加载dll程序集,但是如果你需要对dll进行更新,却发现.net类库没有提供卸载dll程序集的方法。在.net 中,加入了应用程序域的概念,应用程序域是可以卸载的。也就是说,如果需要对动态加载...

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

    反射的加载与卸载,适用于需要经常变换更新的地方。 代码里文件路径是编译的路径(需要替换为自己的存放路径),我是将DLL拷贝到EXE文件夹下测试的,在没有卸载完,拷贝覆盖不了,卸载后就可以覆盖了。

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

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

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

    利用AppDomain实现对DLL的动态加载和卸载。

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

    wince5.0 c#控件源码,注册表操作(创建加载卸载dll驱动)。

    .NET 动态加载DLL文件

    目前对于 Assembly, CLR 没有提供卸载 Assembly 的方法。而 Assembly 是 驻留在 Appdomain 中,Appdomain 是可以动态卸载和创建的。

    使用C#代码安装、卸载、启动、停止Service

    在需要安装的项目文件中添加WindowsService项目的引用,在程序集中获取Service.exe的路径,使用 AssemblyInstaller类对service进行安装。在安装时,使用ServiceController判定服务是否存在,如果已存在该service,则...

    harmonyos2-harmony:用于集成.NET和C的动态加载器和链接器库

    可以存储为嵌入式资源,或存储为任意字节数组,并根据需要动态加载和卸载。 你为什么想做这个? 嗯,.NET 很强大,但它永远不会像编译后的 C 代码那样快。 但是包装的非托管的C DLL与您的托管C#/ VB / F#DLL常常是...

    C#驱动备份神器

    访问这个 DLL ,这样就可以实现驱动程序的动态加载以及动态启动服务和停止服务等等操作了。 而在下面呢,我也算是对以前写的那个 DLL 做一个总结,将其总结为一个 C# 类,这样以后用起来会更加方便。 整个的类,我...

    autocad二次开发不重启调试工具

    但是当c#的开发者在享受c#开发便利的时候,又发现了一个严重的缺陷,那就是修改了代码想重新调试时不得不重启AutoCAD,因为.net的机制限制了c#编译的dll只能加载到进程而无法从进程卸载。为此小弟利用从内存加载的...

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    C#编程经验技巧宝典

    106 <br>0175 如何检索指定条件数组中的元素 107 <br>0176 如何动态改变数组长度 108 <br>0177 如何反转数组中元素的顺序 108 <br>0178 如何排序数组中的元素的顺序 109 <br>0179 如何创建...

    SkinSharp 全部资源

    使用时,确保所有库和皮肤(SkinH_Net.dll, SkinH_CS.dll, skinh.she)和程序在同一目录中。 您可以在任意代码段定义SkinSharp对象并调用接口,但调用时必须保证SkinSharp对象为全局对象,推荐在程序加载时进行...

    P13_Blazor项目模板讲解ThreeBlazor2020_1_11.rar

    还记得Java applet和Microsoft Silverlight吗,我们必须在浏览器中安装插件来运行Java和C#代码,但是WebAssembly提供了基本标准,现在我们不需要任何插件,他的二进制格式以.wasm文件表示,能够提供接近本机的性能...

    asp.net知识库

    C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base...

    vc++6.0小助手

    Visual Assist X v10.0.1233.0 破i解版(Cracked) Visual.Assist.X是一款非常好的Visual Studio .NET 2003、2002插件,支持C/C++、C#、ASP、Visual Basic、Java和HTML等语言,也支持VC++6、VC++5,能自动识别各种...

    ASP.NET的网页代码模型及生命周期

    在ASP.NET中,能够使用面向对象的思想和软件开发中的一些思想,例如封装、派生、继承以及高级的设计模式等。本章首先介绍ASP.NET中最重要的概念---网页代码模型。 4.1 ASP.NET的网页代码模型 在ASP.NET应用程序开发...

Global site tag (gtag.js) - Google Analytics