首先建立一个项目,代码如下,编译成DLL
    
//定义委托
        public delegate void DLLdelegate(object sender,string strVersion); 
         
        //此委托类型类型的事件
        public event DLLdelegate CheckDLLVersion;
//触发事件
        private void DLLVersion_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            CheckDLLVersion(this, strDataBase);
        } 
再建立一个项目,在这个项目上动态调用上面的DLL。//动态加载DLL
 private void DLLToolStripMenuItem_Click(object sender, EventArgs e)
        {
        
            Assembly ass = Assembly.LoadFrom(@"E:\平台\LoadDLL\LoadDLL\bin\Debug\LoadDLL.dll");
            
            Type type = ass.GetType("LoadDLL.Form1");
            strDLLVersion = Assembly.GetAssembly(type).GetName().Version.ToString();
                        Form DLLForm = Activator.CreateInstance(type) as Form;//调用DLL里的事件
            EventInfo evt = type.GetEvent("CheckDLLVersion", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);            Delegate _Deleage = Delegate.CreateDelegate(evt.EventHandlerType, DLLForm, "DLLInvokeEvent");//绑定到目标方法时出错,DLLInvokeEvent是事件的处理方法。
            evt.AddEventHandler(DLLForm, _Deleage);
}        private void DLLInvokeEvent(object sender, string strVersion)
        {
            MessageBox.Show(strVersion);
        }
高手帮帮忙,要怎样才能成功处理DLL的事件。
            

解决方案 »

  1.   

    DLL:public event LoginStatusChangedHandler LoginStatusChanged;
    protected void OnLoginStatusChanged(LoginStatusChangedEventArgs e)
            {
                if (this.LoginStatusChanged != null)
                {
                    this.LoginStatusChanged(this, e);
                }
            }public delegate void LoginStatusChangedHandler(object sender, LoginStatusChangedEventArgs e);调用:(DLL对象).LoginStatusChanged += new LoginStatusChangedHandler(this.OnLoginStatusChanged);private void OnLoginStatusChanged(object sender, LoginStatusChangedEventArgs e)
            {
                //事件处理代码           
            }
      

  2.   

    yuloukong兄好,你这个是在一个项目下的吧?我的例子是在两个项目上的,DLL的事件在另一个项目上是不可见的。所以才要用到反射呀。按你的说法,我应该是用DLLForm.CheckDLLVersion += new DLLdelegate(DLLInvokeEvent);但是这样不行的。
      

  3.   

    public object o = null;
    Type t = ass.GetType("LoadDLL.Form1");
    EventInfo[] infos = t.GetEvents();
    //foreach(Event ev in infos)
    //{
    //    
    //}
    //or
    Event ev = t.GetEvent("str");
    AssemblyName aName = new AssemblyName();
            aName.Name = "DynamicTypes";
            AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run);
            ModuleBuilder mb = ab.DefineDynamicModule(aName.Name);
            TypeBuilder tb = mb.DefineType("Handler", TypeAttributes.Class | TypeAttributes.Public);
            MethodBuilder handler = tb.DefineMethod("DynamicHandler", 
                MethodAttributes.Public | MethodAttributes.Static, 
                invokeMethod.ReturnType, parmTypes);        ILGenerator il = handler.GetILGenerator();
            il.EmitWriteLine("Timer's Elapsed event is raised.");
            il.Emit(OpCodes.Ret);
            Type finished = tb.CreateType();
            MethodInfo eventHandler = finished.GetMethod("DynamicHandler");
            Delegate d = Delegate.CreateDelegate(handlerType, eventHandler);
            ev.AddEventHandler(t, d);
    Delegate d = Delegate.CreateDelegate();
    o.InvokeMember("str1", BindingFlags.SetProperty, null, t, new Object[] { sth});
      

  4.   

    fengniumaxi兄的没有看懂,能不能解释一下