window命令大全
/*主要说明如何通过反射实现动态加载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;
* 因为.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");
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 + "\\" + "";
obj.LoadAssembly(sFileName);
obj.Invoke("类名", "构造方法名", "主程序方法参数");
AppDomain.Unload(ad);
obj = null;
Console.ReadLine();
}
}
string sFileName = Environment.CurrentDirectory + "\\" + "";
obj.LoadAssembly(sFileName);
obj.Invoke("类名", "构造方法名", "主程序方法参数");
AppDomain.Unload(ad);
obj = null;
Console.ReadLine();
}
}
class ProxyObject : MarshalByRefObject
{
Assembly asbly = null;
//加载包含路径的文件
public void LoadAssembly(string AFileName)
{
{
Assembly asbly = null;
//加载包含路径的文件
public void LoadAssembly(string AFileName)
{
asbly = Assembly.LoadFile(AFileName);
}
//实例化该类
public bool Invoke(string AFullClassName, string AMethodName, params Object[] args)
console命令大全 {
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;
}
//实例化该类
public bool Invoke(string AFullClassName, string AMethodName, params Object[] args)
console命令大全 {
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
Object obj = Activator.CreateInstance(tp);
//激活该对象
mInfo.Invoke(obj, args);
return true;
}
}
#endregion
}
注意:
1. 要想让一个对象能够穿过AppDomain边界,必须要继承MarshalByRefObject类,否则无法被其他AppDomain使用。
2. 每个线程都有一个默认的AppDomain,可以通过Thread.GetDomain()来得到
3.以上是参考网上资料,但是标注不清楚,造成我一直无法调试成功,看样子注释还是很重要的!
注意:
1. 要想让一个对象能够穿过AppDomain边界,必须要继承MarshalByRefObject类,否则无法被其他AppDomain使用。
2. 每个线程都有一个默认的AppDomain,可以通过Thread.GetDomain()来得到
3.以上是参考网上资料,但是标注不清楚,造成我一直无法调试成功,看样子注释还是很重要的!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论