首先建立一个项目,代码如下,编译成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的事件。
//定义委托
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的事件。
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)
{
//事件处理代码
}
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});