找回密码
 立即注册

QQ登录

只需一步,快速开始

thrall

超级版主

14

主题

174

帖子

2072

积分

超级版主

Rank: 8Rank: 8

积分
2072

活字格认证微信认证勋章

thrall
超级版主   /  发表于:2013-5-6 12:16  /   查看:6616  /  回复:1
有两个 Assembly A,B 在A中声明了一个事件(某个类中的某个事件), B没有引用这Assembly ,但是想挂A中的这个事件。当A中的某个逻辑fire这个Event时,B挂事件的地方要(B的handler)要做些事情。

FireFarEvent 是 Assembly A, MainForm 类公开一个 SomeEvent 事件, FireEvent button 会 Fire 这个 Event.

AttachFarEvent 是 Assembly B, AttachFarEventForm 中 btnAttachEvent_Click 会 hook FireFarEvent 中的 SomeEvent.



AttachFarEvent代码如下:

  1. private void btnAttachEvent_Click(object sender, EventArgs e)
  2.         {
  3.             if(assembly == null || fireEventForm == null)
  4.             {
  5.                 MessageBox.Show("Please click the first button to load the fire event form.");
  6.                 return;
  7.             }
  8.             Type fireFarEventFormType = fireEventForm.GetType();
  9.             farEventEventInfo = fireFarEventFormType.GetEvent("SomeEvent");

  10.             EventHandler tempHandler = new EventHandler(this.farEventHandler); // for dynamic method.
  11.             MethodInfo tempHandlerMethodInfo = tempHandler.Method;


  12.             DynamicMethod dynamicMethod = new DynamicMethod(
  13.                 "BridgeMethodForAttachEvent", typeof(void),
  14.                 new Type[] { typeof(object), assembly.GetType("FireFarEvent.FarEventArgs") },
  15.                 this.GetType());

  16.             ILGenerator il = dynamicMethod.GetILGenerator();

  17.             il.Emit(OpCodes.Nop);
  18.             il.Emit(OpCodes.Ldarg_0);
  19.             il.Emit(OpCodes.Ldarg_2);
  20.             il.Emit(OpCodes.Ldarg_1);
  21.             il.Emit(OpCodes.Call, tempHandlerMethodInfo);
  22.             il.Emit(OpCodes.Nop);
  23.             il.Emit(OpCodes.Ret);

  24.             dynamicMethod.DefineParameter(1, ParameterAttributes.In, "object");
  25.             dynamicMethod.DefineParameter(2, ParameterAttributes.In, "e");

  26.             farEventDelegate = dynamicMethod.CreateDelegate(farEventEventInfo.EventHandlerType);
  27.             farEventEventInfo.AddEventHandler(fireEventForm, farEventDelegate);
  28.         }
复制代码

DetachFarEvent代码如下:
  1. private void btnDetachEvent_Click(object sender, EventArgs e)
  2.         {
  3.             if (assembly == null || fireEventForm == null || farEventEventInfo == null)
  4.             {
  5.                 MessageBox.Show("Please click the first button to load the fire event form.");
  6.                 return;
  7.             }
  8.             farEventEventInfo.RemoveEventHandler(fireEventForm, farEventDelegate);
  9.         }
复制代码








Demo下载:AttachFarEvent.rar

1 个回复

倒序浏览
Carl
版主   /  发表于:2013-5-7 08:59:00
沙发
高级!
愿 Engine 归于沉寂,Timer 停止运动,Message Queue 不再流淌,Data Source 为我掌握
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部