动态加载dll并执行及卸载

2021-03-03  本文已影响0人  价值投机168

写一个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程序的目录下,然后执行看效果。

上一篇 下一篇

猜你喜欢

热点阅读