回答編集履歴
5
修正
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
修正
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
|
-
|
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
修正
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
修正
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
|
-
|
39
|
+
dynamicElapsed.CreateDelegate(evElapsed.EventHandlerType));
|
40
40
|
_Timer.Start();
|
41
41
|
|
42
42
|
Task.Delay(1000000).Wait();
|
1
修正
answer
CHANGED
@@ -23,13 +23,13 @@
|
|
23
23
|
|
24
24
|
var evElapsed = typeTimer.GetEvent("Elapsed");
|
25
25
|
var typeElapsedHandler = evElapsed.GetAddMethod()
|
26
|
-
|
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);
|