`

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 #### 一、引言 在软件开发过程中,动态链接库(Dynamic Link Library,简称DLL)作为一种重要的模块化工具,广泛应用于多种编程语言中。在C++中,通过`LoadLibrary`和`FreeLibrary`函数可以...

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

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

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

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

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

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

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

    在.NET框架中,C#程序员...通过以上解释,我们可以理解如何利用反射在C#中动态加载和执行DLL文件,以及在使用过程中需要注意的关键点。动态加载DLL是.NET开发中的一个重要技巧,它使得我们的应用程序更加灵活和可扩展。

    DotNet平台DLL动态加载示例

    DLL动态加载是指程序在运行时通过API调用来加载和卸载DLL,而不是在编译时将其链接到可执行文件中。这样可以减少程序的大小,提高资源利用率,并允许不同应用程序共享同一DLL。 2. **C#中的DllImportAttribute** ...

    C# 学习之常用技术

    ### C# 学习之常用技术 #### 一、事务处理:批量提交与回滚 在C#中,事务管理是...总结而言,通过上述两种方法,开发者可以在C#中有效地处理事务以及动态加载和卸载DLL,这对于构建灵活且高效的应用程序非常重要。

    C#实现DLL热插拔

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

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

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

    C#动态加载DLL的DEMO

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

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

    标题和描述中提到的知识点是关于在C#中动态加载DLL文件,并调用该DLL中包含的方法。这种方法在许多软件开发场景中非常有用,尤其是当需要在运行时加载和使用外部插件或组件时。 首先,动态加载DLL主要涉及到.NET...

    C#中如何调用动态链接库DLL

    - **灵活性**:DLL可以在运行时动态加载和卸载,提高了系统的响应速度。 - **模块化**:便于开发模块化的软件架构,有助于多语言版本的开发。 - **易于维护**:当DLL中的函数需要更新时,只需替换相应的DLL文件即可...

    C#动态调用Dll的研究

    C#中动态调用DLL分为两种主要方式:静态加载和动态加载。静态加载是在编译时就确定了DLL的引用,而动态加载则是在运行时通过编程方式决定是否加载DLL。动态加载通常使用`DllImport`特性来实现,它允许C#程序调用非...

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

    在C#中,动态加载DLL文件通常涉及到两个关键步骤:查找DLL文件和加载DLL中的类或方法。这个压缩包中的"PluginsTest"可能就是包含了一个简单的WPF应用,它展示了如何实现这些步骤。 1. **查找DLL文件**:通常,插件...

    c# dll封装以及调用

    **四、延迟加载和卸载DLL** 1. **延迟加载**:使用`Assembly.LoadFrom()`方法可以在运行时按需加载DLL,减少程序启动时的资源消耗。 2. **卸载DLL**:.NET框架不支持直接卸载DLL,但可以通过重新加载应用程序域(`...

    c# 插件框架灵活加载dll

    C# 插件框架灵活加载DLL是一个强大的技术实践,它允许开发者构建可扩展的应用程序,通过动态加载外部DLL(动态链接库)文件来实现特定功能。这种设计模式使得应用程序能够根据用户需求或环境变化,轻松地增加、更新...

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

    这两个函数是Windows API的一部分,用于在运行时加载和调用DLL中的函数。`LoadLibrary`函数负责将DLL加载到进程地址空间,而`GetProcAddress`则用于获取DLL中特定函数的地址,以便后续调用。 1. `LoadLibrary`: 当...

Global site tag (gtag.js) - Google Analytics