beysup 发表于 27-1-2010 18:23:45

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

woodheadz 发表于 28-1-2010 01:52:54

没用反射来操作过事件,所以没碰到过楼主的问题。 有没有进一步的错误信息?
另外说句闲话,不知道楼主想要做什么,但这种纯粹依赖反射来完成的逻辑是相当糟糕的设计。肯定有好很多倍的做法。

NoChoice 发表于 28-1-2010 08: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 编辑 ]

beysup 发表于 28-1-2010 12:18:08

主要目的是实现对自定义类型库的动态绑定,而不是编译时绑定。

woodheadz 发表于 28-1-2010 13:51:56

单纯通过反射来完成这样的工作是个错误的方向。
三楼的TZ用接口的思路就比较对了,但有点不明白为什么不是这样:

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

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

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

czy0058 发表于 29-1-2010 09:50:39

原帖由 woodheadz 于 28-1-2010 13:51 发表 http://www.freeoz.org/bbs/images/common/back.gif
单纯通过反射来完成这样的工作是个错误的方向。
三楼的TZ用接口的思路就比较对了,但有点不明白为什么不是这样:

                        //创建object
                        IPlugin obj = (IPlugin)Activ ...
楼上的做法应该是正确的

flyspirit 发表于 5-2-2010 10:59:47

回复 #5 woodheadz 的帖子

我也觉得用Attribute比较好。

楼主是不是一定要动态装配Event和Delegate? 如果不是必须,那3楼的方法就足够了。
页: [1]
查看完整版本: .net环境下后期绑定自定义类库的问题