C#动态加载DLL(反射学习(二))
来源:互联网 发布:苹果移动数据怎么快捷 编辑:程序博客网 时间:2024/05/01 07:36
/*主要说明如何通过反射实现动态加载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.以上是参考网上资料,但是标注不清楚,造成我一直无法调试成功,看样子注释还是很重要的!
- C#动态加载DLL(反射学习(二))
- C#通过反射实现动态加载DLL
- C#动态加载dll或exe类库(即C#反射)
- C#中使用反射动态加载和卸载DLL
- C#中使用反射来动态加载和卸载DLL
- C#中使用反射来动态加载和卸载DLL
- C#中使用反射动态加载和卸载DLL
- 通过反射动态加载DLL
- C#动态加载DLL
- C#动态加载DLL
- C#动态加载DLL
- C#动态加载DLL
- C#动态加载DLL
- C#动态加载DLL
- C#动态加载DLL
- C#动态加载DLL
- C# 动态加载dll
- C#动态加载DLL
- 《渴望生活——梵高传》读后感
- 冒泡排序算法分析!
- MyEclipse 6.01 professional版本注册码
- EJB3 测试
- G公司面试经验总结【来源于网络】
- C#动态加载DLL(反射学习(二))
- 书摘-自动自发
- Windows控制面板编程
- jcaptcha
- 分众无线CEO徐茂栋为新媒体解决效果短板
- 图像分割概述(收藏) - ywywcy的专栏 - CSDNBlog
- 沙发的故事——人才的价值在于贡献度?
- 使用Register/Notify模式在C#中实现非托管资源的统一处置
- C#中DataGridView多層表頭的制作(1)