找回密码
 FreeOZ用户注册
查看: 2000|回复: 6
打印 上一主题 下一主题

[论坛技术] .net环境下后期绑定自定义类库的问题

[复制链接]
跳转到指定楼层
1#
发表于 27-1-2010 17:23:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
大虾们,有一个问题

.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);
回复  

使用道具 举报

2#
发表于 28-1-2010 00:52:54 | 只看该作者
没用反射来操作过事件,所以没碰到过楼主的问题。 有没有进一步的错误信息?
另外说句闲话,不知道楼主想要做什么,但这种纯粹依赖反射来完成的逻辑是相当糟糕的设计。肯定有好很多倍的做法。
回复  

使用道具 举报

3#
发表于 28-1-2010 07:58:23 | 只看该作者
这是我程序里面的一段,你可以参考参考
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 编辑 ]
回复  

使用道具 举报

4#
 楼主| 发表于 28-1-2010 11:18:08 | 只看该作者
主要目的是实现对自定义类型库的动态绑定,而不是编译时绑定。
回复  

使用道具 举报

5#
发表于 28-1-2010 12:51:56 | 只看该作者
单纯通过反射来完成这样的工作是个错误的方向。
三楼的TZ用接口的思路就比较对了,但有点不明白为什么不是这样:

                        //创建object
                        IPlugin obj = (IPlugin)Activator.CreateInstance(t);
                        //假设IplugIn接口有一个MyEvent事件
                        obj.MyEvent += new .......

有类型安全的话在编写程序时能省很多力气,而且重构后也不容易出问题,对程序的健壮度很有帮助。

  另外查找实现IPlugin对象的方法也不是很恰当。 目前比较通用的做法是自定义一个Attribute,标记一下实现了IPlugin接口的类。
回复  

使用道具 举报

6#
发表于 29-1-2010 08:50:39 | 只看该作者
原帖由 woodheadz 于 28-1-2010 13:51 发表
单纯通过反射来完成这样的工作是个错误的方向。
三楼的TZ用接口的思路就比较对了,但有点不明白为什么不是这样:

                        //创建object
                        IPlugin obj = (IPlugin)Activ ...

楼上的做法应该是正确的
回复  

使用道具 举报

7#
发表于 5-2-2010 09:59:47 | 只看该作者

回复 #5 woodheadz 的帖子

我也觉得用Attribute比较好。

楼主是不是一定要动态装配Event和Delegate? 如果不是必须,那3楼的方法就足够了。
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 25-8-2025 01:26 , Processed in 0.016859 second(s), 23 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表