C#通过反射实现动态加载DLL
2011-06-09 13:32
846 查看
/*主要说明如何通过反射实现动态加载DLL,
* 因为.Net底层有自动回收机制,所以不需要考虑这个问题
* ADD by Brian 2008/01/21 参考MSDN
*/
using System;
using System.IO;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.Remoting;
namespace DynamicIncreaseDLL
{
#region
class DynamicLoadDLL
{
[STAThread]
static void Main(string[] args)
{
string sCallDomainName = Thread.GetDomain().FriendlyName;
Console.WriteLine(sCallDomainName);
//创建一个动态程序域
Console.WriteLine("请输入动态程序域名称");
string sAD = Console.ReadLine();
AppDomain ad = AppDomain.CreateDomain(sAD);
//实例化一个ProxyObject这个类型的对象 这个是需要加载DLL的对象
ProxyObject obj = (ProxyObject)ad.CreateInstanceAndUnwrap("DynamicIncreaseDLL", "DynamicIncreaseDLL.ProxyObject");
//自己抓一个需要动态加载的DLL的文件名(包含文件路径)
string sFileName = Environment.CurrentDirectory + "//" + "gmrbrian.exe";
obj.LoadAssembly(sFileName);
obj.Invoke("类名", "构造方法名", "主程序方法参数");
AppDomain.Unload(ad);
obj = null;
Console.ReadLine();
}
}
class ProxyObject : MarshalByRefObject
{
Assembly asbly = null;
//加载包含路径的文件
public void LoadAssembly(string AFileName)
{
asbly = Assembly.LoadFile(AFileName);
}
//实例化该类
public bool Invoke(string AFullClassName, string AMethodName, params Object[] args)
{
if (asbly == null)
return false;
//获取该类的类型
Type tp = asbly.GetType(AFullClassName);
if (tp == null)
return false;
//获取该类的构造方法
MethodInfo mInfo = tp.GetMethod(AMethodName);
if (mInfo == null)
return false;
//实例化该类
Object obj = Activator.CreateInstance(tp);
//激活该对象
mInfo.Invoke(obj, args);
return true;
}
}
#endregion
}
注意:
1. 要想让一个对象能够穿过AppDomain边界,必须要继承MarshalByRefObject类,否则无法被其他AppDomain使用。
2. 每个线程都有一个默认的AppDomain,可以通过Thread.GetDomain()来得到
3.以上是参考网上资料,但是标注不清楚,造成我一直无法调试成功,看样子注释还是很重要的!
* 因为.Net底层有自动回收机制,所以不需要考虑这个问题
* ADD by Brian 2008/01/21 参考MSDN
*/
using System;
using System.IO;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.Remoting;
namespace DynamicIncreaseDLL
{
#region
class DynamicLoadDLL
{
[STAThread]
static void Main(string[] args)
{
string sCallDomainName = Thread.GetDomain().FriendlyName;
Console.WriteLine(sCallDomainName);
//创建一个动态程序域
Console.WriteLine("请输入动态程序域名称");
string sAD = Console.ReadLine();
AppDomain ad = AppDomain.CreateDomain(sAD);
//实例化一个ProxyObject这个类型的对象 这个是需要加载DLL的对象
ProxyObject obj = (ProxyObject)ad.CreateInstanceAndUnwrap("DynamicIncreaseDLL", "DynamicIncreaseDLL.ProxyObject");
//自己抓一个需要动态加载的DLL的文件名(包含文件路径)
string sFileName = Environment.CurrentDirectory + "//" + "gmrbrian.exe";
obj.LoadAssembly(sFileName);
obj.Invoke("类名", "构造方法名", "主程序方法参数");
AppDomain.Unload(ad);
obj = null;
Console.ReadLine();
}
}
class ProxyObject : MarshalByRefObject
{
Assembly asbly = null;
//加载包含路径的文件
public void LoadAssembly(string AFileName)
{
asbly = Assembly.LoadFile(AFileName);
}
//实例化该类
public bool Invoke(string AFullClassName, string AMethodName, params Object[] args)
{
if (asbly == null)
return false;
//获取该类的类型
Type tp = asbly.GetType(AFullClassName);
if (tp == null)
return false;
//获取该类的构造方法
MethodInfo mInfo = tp.GetMethod(AMethodName);
if (mInfo == null)
return false;
//实例化该类
Object obj = Activator.CreateInstance(tp);
//激活该对象
mInfo.Invoke(obj, args);
return true;
}
}
#endregion
}
注意:
1. 要想让一个对象能够穿过AppDomain边界,必须要继承MarshalByRefObject类,否则无法被其他AppDomain使用。
2. 每个线程都有一个默认的AppDomain,可以通过Thread.GetDomain()来得到
3.以上是参考网上资料,但是标注不清楚,造成我一直无法调试成功,看样子注释还是很重要的!
相关文章推荐
- C#,动态加载DLL,通过反射,调用参数,方法,窗体
- C#实现反射调用动态加载的DLL文件中的方法
- C#实现反射调用动态加载的DLL文件中的方法
- C#实现反射调用动态加载的DLL文件中的方法
- C#实现反射调用动态加载的DLL文件中的方法
- C#.NET dll封装(包含UI和实现函数),通过反射调用dll实现控件的快速加载(PrimPointList.cs)
- C#实现反射调用动态加载的DLL文件中的方法
- C#.NET dll封装(包含UI和实现函数),通过反射调用dll实现控件的快速加载(PrimPointListCreator.cs)
- C#动态加载DLL,通过配置文件实现对程序集的即插即用
- C#实现反射调用动态加载的DLL文件中的方法
- VC++通过动态生成并加载DLL,实现可执行文件的自删除
- C#.NET dll封装(包含UI和实现函数),通过反射调用dll实现控件的快速加载(PointListTypeAttributes.cs)
- C# 利用反射动态加载dll
- c#实现动态加载Dll
- C#动态加载dll或exe类库(即C#反射)
- C#动态加载DLL(反射学习(二))
- C# 通过 AppDomain 应用程序域实现程序集动态卸载或加载
- C#如何通过反射实现动态功能模块加载
- 简易C#动态加载dll(实现插件化)
- VC++通过动态生成并加载DLL,实现可执行文件的自删除