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