質問するログイン新規登録

回答編集履歴

5

修正

2021/03/13 10:25

投稿

退会済みユーザー
answer CHANGED
@@ -1,4 +1,4 @@
1
- DynamicMethodを経由したら一応デリゲートの型を騙せましたが、使用方法的に問題ないかは全く調査・検証してないです。
1
+ DynamicMethodを経由したら一応イベントの登録には成功しましたが、使用方法的に問題ないかは全く調査・検証してないです。
2
2
 
3
3
  【参考にしたページ】
4
4
  [方法: リフレクションを使用してデリゲートをフックする](https://docs.microsoft.com/ja-jp/dotnet/framework/reflection-and-codedom/how-to-hook-up-a-delegate-using-reflection)

4

修正

2021/03/13 10:25

投稿

退会済みユーザー
answer CHANGED
@@ -14,6 +14,7 @@
14
14
  class Program
15
15
  {
16
16
  static dynamic _Timer = null;
17
+ static Delegate _ElapsedHandler;
17
18
 
18
19
  static void Main(string[] args)
19
20
  {
@@ -33,9 +34,10 @@
33
34
  il.Emit(OpCodes.Ret);
34
35
 
35
36
  var evElapsed = typeTimer.GetEvent("Elapsed");
37
+ _ElapsedHandler = dynamicElapsed.CreateDelegate(evElapsed.EventHandlerType);
36
38
  evElapsed.AddEventHandler(
37
39
  _Timer,
38
- dynamicElapsed.CreateDelegate(evElapsed.EventHandlerType));
40
+ _ElapsedHandler);
39
41
  _Timer.Start();
40
42
 
41
43
  Task.Delay(1000000).Wait();
@@ -50,4 +52,5 @@
50
52
  }
51
53
  }
52
54
  }
55
+
53
56
  ```

3

修正

2021/03/13 10:23

投稿

退会済みユーザー
answer CHANGED
@@ -21,8 +21,6 @@
21
21
  var typeTimer = a.GetType("System.Timers.Timer");
22
22
  _Timer = Activator.CreateInstance(typeTimer, new object[] { 100.0 });
23
23
 
24
- var evElapsed = typeTimer.GetEvent("Elapsed");
25
-
26
24
  var dynamicElapsed = new DynamicMethod(
27
25
  "",
28
26
  typeof(void),
@@ -34,6 +32,7 @@
34
32
  il.Emit(OpCodes.Call, typeof(MyClass).GetMethod("OnElapsed"));
35
33
  il.Emit(OpCodes.Ret);
36
34
 
35
+ var evElapsed = typeTimer.GetEvent("Elapsed");
37
36
  evElapsed.AddEventHandler(
38
37
  _Timer,
39
38
  dynamicElapsed.CreateDelegate(evElapsed.EventHandlerType));

2

修正

2021/03/13 08:50

投稿

退会済みユーザー
answer CHANGED
@@ -22,8 +22,6 @@
22
22
  _Timer = Activator.CreateInstance(typeTimer, new object[] { 100.0 });
23
23
 
24
24
  var evElapsed = typeTimer.GetEvent("Elapsed");
25
- var typeElapsedHandler = evElapsed.GetAddMethod()
26
- .GetParameters()[0].ParameterType;
27
25
 
28
26
  var dynamicElapsed = new DynamicMethod(
29
27
  "",
@@ -36,7 +34,9 @@
36
34
  il.Emit(OpCodes.Call, typeof(MyClass).GetMethod("OnElapsed"));
37
35
  il.Emit(OpCodes.Ret);
38
36
 
37
+ evElapsed.AddEventHandler(
38
+ _Timer,
39
- evElapsed.AddEventHandler(_Timer, dynamicElapsed.CreateDelegate(typeElapsedHandler));
39
+ dynamicElapsed.CreateDelegate(evElapsed.EventHandlerType));
40
40
  _Timer.Start();
41
41
 
42
42
  Task.Delay(1000000).Wait();

1

修正

2021/03/13 08:48

投稿

退会済みユーザー
answer CHANGED
@@ -23,13 +23,13 @@
23
23
 
24
24
  var evElapsed = typeTimer.GetEvent("Elapsed");
25
25
  var typeElapsedHandler = evElapsed.GetAddMethod()
26
- .GetParameters()[0]
26
+ .GetParameters()[0].ParameterType;
27
- .ParameterType;
28
27
 
29
28
  var dynamicElapsed = new DynamicMethod(
30
29
  "",
31
30
  typeof(void),
32
31
  new Type[] { typeof(object), typeof(object) });
32
+
33
33
  var il = dynamicElapsed.GetILGenerator();
34
34
  il.Emit(OpCodes.Ldarg_0);
35
35
  il.Emit(OpCodes.Ldarg_1);