.net环境下后期绑定自定义类库的问题
大虾们,有一个问题.dll(iGenDLL.GenDLL)中定义类中包含事件:
public delegate void TestOne(object sender, string strPar1, string strPar2);
public event TestOne TestOneEvent;
然后使用后期绑定方式调用.dll
// Load assembly from dll file
Assembly assembly = Assembly.LoadFrom(spath); //spath is the path of .dll file
//其次,用加载的assembly来定义指定的类型,例如:
// Create new type
Type t = assembly.GetType("iGenDLL.GenDLL");
Type _DelegateType = assembly.GetType("iGenDLL.testOne");
object _Value = System.Activator.CreateInstance(t);
System.Reflection.EventInfo _Event = t.GetEvent("testOneEvent", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
Delegate _Deleage = Delegate.CreateDelegate(_DelegateType, _Value, "MyEvent");//问题出现在这一行,Error binding totarget method
_Event.AddEventHandler(_Value, _Deleage); 没用反射来操作过事件,所以没碰到过楼主的问题。 有没有进一步的错误信息?
另外说句闲话,不知道楼主想要做什么,但这种纯粹依赖反射来完成的逻辑是相当糟糕的设计。肯定有好很多倍的做法。 这是我程序里面的一段,你可以参考参考
DirectoryInfo di=new DirectoryInfo(@m_PluginFolder);
//从plugin目录中找出所有dll文件
FileInfo[] files=di.GetFiles("*.dll");
foreach(FileInfo pluginFile in files)
{
//不是所有dll文件都是我自己定义的assembly,所以要筛选
Assembly asm=Assembly.LoadFrom(pluginFile.FullName);
Type[] ts=asm.GetTypes();
foreach( Type t in ts )
{
//如果assembly有我自己定义的IPlugin interface的话,就执行myevent函数
if(t.GetInterface("IPlugin")!=null)
{
//创建object
Object obj = Activator.CreateInstance(t);
//找到myevent函数
MethodInfo foo = t.GetMethod("MyEvent");
//调用myevent函数,没有参数,否则替换掉null
foo.Invoke(obj,null));
}
}
}
[ 本帖最后由 NoChoice 于 28-1-2010 09:01 编辑 ] 主要目的是实现对自定义类型库的动态绑定,而不是编译时绑定。 单纯通过反射来完成这样的工作是个错误的方向。
三楼的TZ用接口的思路就比较对了,但有点不明白为什么不是这样:
//创建object
IPlugin obj = (IPlugin)Activator.CreateInstance(t);
//假设IplugIn接口有一个MyEvent事件
obj.MyEvent += new .......
有类型安全的话在编写程序时能省很多力气,而且重构后也不容易出问题,对程序的健壮度很有帮助。
另外查找实现IPlugin对象的方法也不是很恰当。 目前比较通用的做法是自定义一个Attribute,标记一下实现了IPlugin接口的类。 原帖由 woodheadz 于 28-1-2010 13:51 发表 http://www.freeoz.org/bbs/images/common/back.gif
单纯通过反射来完成这样的工作是个错误的方向。
三楼的TZ用接口的思路就比较对了,但有点不明白为什么不是这样:
//创建object
IPlugin obj = (IPlugin)Activ ...
楼上的做法应该是正确的
回复 #5 woodheadz 的帖子
我也觉得用Attribute比较好。楼主是不是一定要动态装配Event和Delegate? 如果不是必须,那3楼的方法就足够了。
页:
[1]