美文网首页
动态加载dll并执行及卸载

动态加载dll并执行及卸载

作者: 价值投机168 | 来源:发表于2021-03-03 18:56 被阅读0次

写一个exe程序:

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Reflection;
using System.IO;

namespace UnloadDll
{
class Program
{
    static void Main(string[] args)
    {
        //AppDomain是CLR的运行单元,它可以加载Assembly、创建对象以及执行程序。
        //AppDomain是一个独立执行应用程序的环境,当AppDomain被卸载的 时候,在该环境中的所有资源也将被回收。
        string callingDomainName = AppDomain.CurrentDomain.FriendlyName;//当前的AppDomain
        Console.WriteLine(callingDomainName);

        AppDomain ad = AppDomain.CreateDomain("DLL Unload testtt");//创建一个AppDomain

        //Assembly.GetExecutingAssembly().Location得到当前exe的路径
        ProxyObject obj = (ProxyObject)ad.CreateInstanceFromAndUnwrap(Path.GetFileName(Assembly.GetExecutingAssembly().Location), 
            "UnloadDll.ProxyObject");//第一个是运行程序的程序名,第二个是动态加载的类名,见下面的代码
        obj.LoadAssembly();//加载进来
        obj.Invoke("TestDll.Class1", "Test", "It's a test");//执行方法,并传参数
        AppDomain.Unload(ad);//卸载dll了

        obj = null;
        Console.ReadLine();
    }
}

[Serializable]
class ProxyObject //: MarshalByRefObject 与上面的[Serializable]可以相互替换
{
    Assembly assembly = null;
    string curPath;

    public ProxyObject()
    {
        curPath = System.Environment.CurrentDirectory;
    }

    public void LoadAssembly()
    {
        assembly = Assembly.LoadFile(curPath + @"\test.dll");//把dll加载进来
    }

    public bool Invoke(string fullClassName, string methodName, params Object[] args)
    {
        if (assembly == null)
            return false;
        Type tp = assembly.GetType(fullClassName);//根据class名找到Type
        if (tp == null)
            return false;
        MethodInfo method = tp.GetMethod(methodName);//根据type得到方法
        if (method == null)
            return false;
        Object obj = Activator.CreateInstance(tp);//创建一个实例
        method.Invoke(obj, args);//在这个对象上执行
        return true;
    }
}
}

写一个dll程序:

namespace TestDll
{
public class Class1
{
    public void Test(string str)
    {
        Console.WriteLine("TestDll; " + str);
    }
}
}

把这个dll程序拷贝到exe程序的目录下,然后执行看效果。

相关文章

  • 动态加载dll并执行及卸载

    写一个exe程序: 写一个dll程序: 把这个dll程序拷贝到exe程序的目录下,然后执行看效果。

  • golang调用DLL中的函数

    在golang中加载dll并调用函数流程如下:1.加载dll动态库到内存 syscall.LoadLibrary2...

  • DLL的动态(手工)加载

    手工加载 使用LoadLibrary来加载dll使用FreeLibrary来卸载dll它提供了一种在运行时、手工加...

  • 制作单文件绿色软件

    如果不知道 exe 所依赖的 dll,可能是动态加载的 dll,可通过 ollydbg 调试 exe,查看加载的模...

  • 应用程序加载

    应用程序加载原理库:可执行的二进制文件,加载到内存文件类型:静态库 .a动态库 .so .dll两者是链接的区别 ...

  • 插件化

    插件化插件化和热修复都 属于动态加载技术 动态加载技术在应用程序运行时,动态加载一些程序中原本不存在的可执行文件并...

  • 【网络安全】红队攻防之基础免杀

    引言 本文主要介绍“反射型dll注入”及“柔性加载”技术。 反射型dll注入 为什么需要反射型dll注入 常规的d...

  • Android插件化

    动态加载技术 原理:在应用程序运行时,动态加载一些程序中原本不存在的可执行文件并运行这些文件里的代码逻辑。可执行文...

  • 反射

    .Net Framework 中提供了反射机制,可以在加载程序运行时,动态获取和加载程序集(dll),并且可以获取...

  • VC++适时动态曲线绘制并打印及预览,有一定的参考价值

    VC++适时动态曲线绘制并打印及预览,源码包包含一个DLL组件的源代码,本程序可适时生成统计曲线,并预览、载入外部...

网友评论

      本文标题:动态加载dll并执行及卸载

      本文链接:https://www.haomeiwen.com/subject/egkcqltx.html