曾经在网上搜过不少方法,也发贴问过,对于动态加载DLL的方法,仿佛使用反射的方法是最常规的处理意见,但真正到了自己运用时,才知道还是没有理解到真正的方法,特再次高分求解!
1、首先,被调用的DLL文件与程序都属于自己编写的,命名空间相同;
2、由于管理需要,(假设)被调用的DLL文件全部放在D:\ERP\DD文件夹内,程序放到D:\ERP\PRO文件内;
3、DLL文件里设有:域、属性、静态方法、非静态方法等,构造函数包含4个string参数,必须带参数实例化;
问题:
1、D:\ERP\PRO文件内的程序,如何在启动时或某个事件动态加载D:\ERP\DD文件夹内的DLL文件?
2、如何取出DLL文件里域的值,或调用DLL文件里的方法静态或非静态方法?
网上找过很多方法都不行,只好求代码!
1、首先,被调用的DLL文件与程序都属于自己编写的,命名空间相同;
2、由于管理需要,(假设)被调用的DLL文件全部放在D:\ERP\DD文件夹内,程序放到D:\ERP\PRO文件内;
3、DLL文件里设有:域、属性、静态方法、非静态方法等,构造函数包含4个string参数,必须带参数实例化;
问题:
1、D:\ERP\PRO文件内的程序,如何在启动时或某个事件动态加载D:\ERP\DD文件夹内的DLL文件?
2、如何取出DLL文件里域的值,或调用DLL文件里的方法静态或非静态方法?
网上找过很多方法都不行,只好求代码!
_objAssembly.CreateInstance("类名", false, BindingFlags.Default, null, objPara, null, null);
CreateInstance方法会根据你的参数个数,类型,自动进行匹配有效的构造函数进行实例化
interface IMy
{
// 你要调用的方法...
}扩展dll实现接口,调用就非常方便了。IMy imy = null;
Assembly assembly = ...;
foreach(Type t in assembly.GetTypes())
{
if(typeof(IMy).IsAssignableFrom(t))
{
imy = Activator.CreateInstance(t) as IMy;
}
}
imy.你要调用的方法();
根据标志加载不同目录下的dll.它们都实现了同样的接口
IGenerator generator = null;
if (pfsOrder.isSrmDevice)
{
assembly = Assembly.LoadFrom( basePath + "AccessCodeGenerator\\SnakeEyes\\Fulfilment.AccessCodes.SnakeEyes.dll" );
generator= (IGenerator) assembly.CreateInstance( "Pongrass.PES.Fulfilment.AccessCodeGeneratorSnakeEyes" );}
else
{
assembly = Assembly.LoadFrom( basePath + "PES.Fulfilment.AccessCodes.dll" );
generator= (IGenerator) assembly.CreateInstance( "Pongrass.PES.Fulfilment.AccessCodeGenerator" );
}
带参数的构造函数参见3楼回答
2楼给的链接早看过了,也打印出来实作过,但里没有调用DLL里的域或属性的方法,只讲了怎么设用其中方法!
DLL文件其实一个关于权限的类,我不想写到每个一程序中,而希望每个程序直接去调用这个DLL类库:
public class PowerControl
{
public string serverIP;
public string serverUser;
public string serverPwd;
public bool rSee; //查询
public bool rAlter; //修改
public bool rDel; //删除
public bool rSanction; //审核
/// <summary>
/// 构造函数
/// </summary>
public PowerControl(string ServerIP, string ServerUser, string ServerPwd)
{
serverIP = ServerIP;
serverUser = ServerUser;
serverPwd = ServerPwd;
}
public void SetPowerControl()
{
...........//很长一串从数据库取出权限值,已测试没有问题;
rSee=StrToBool(rPower.Substring(1, 1)); //查询
rAlter=StrToBool(rPower.Substring(2, 1)); //修改
rDel=StrToBool(rPower.Substring(3, 1)); //删除
rSanction=StrToBool(rPower.Substring(4, 1)); //审核
}
private bool StrToBool(string YorN)
{
if (YorN == "Y")
return true;
else
return false;
}
}然后程序怎么去调用这个DLL文件,并获取DLL文件中SetPowerControl方法后rSee,rAlter,rDel,rSanction的值作为本程序权限的设定?
如果都要用到PowerControl类,而不是需要动态插拔。
那么直接添加到PowerControl项目的引用就可以了。
然后反射调用即可。当然,也可以开发直接应用,部署时,先运行加载的方法,然后调用主程序的入口即可。----------------
通用的bootstrap,都一般是这么做的,自己加载dll
Type type=assembly.GetType("PowerControl的全名");
Object obj=Activator.CreateInstance(type,serverip,serveruser,serverpwd);
MethodInfo info=type.GetMethod("SetPowerControl");info.Invoke(obj,null); //调用SetPowerControl方法取rSee,rAlter,rDel,rSanction的值,方法差不多FieldInfo field=type.GetField("rSee");
object rsee=field.GetValue(obj);