タイトルだとちょっと意味が分かりづらいと思います。
自分もなんて表現したらいいかわからずこんな感じになってしまいました。
少し長くなってしまいますがご了承ください。
現在、DLLを動的にロードして使用するようにコーディングをしています。
細かい理由は言えませんが、ざっくりいうと普通に参照してDLLで定義されたものをインスタンス化させることができません。
DLLで定義されているイベントに対して、自分で定義したメソッドを登録しようとしています。
C#
1public delegate void DLLEvent(ushort[] data1, DLLInterface data2); 2public event DLLEvent DLLHandle;
このような感じで定義されているDLLHandle
というイベントに対して
C#
1EventInfo info = Dlltype.GetEvent("DLLHandle"); 2Delegate delegate = Delegate.CreateDelegate(info.EventHandlerType, this, "MyHandle") 3info.AddEventHandler( instance, delegate );
と、このようにしてイベントへの登録をしようとしています。
instance
という変数はActivator.CreateInstance()
を使用して取得した、イベントを持っているクラスのインスタンスです。
ここで問題になっているのが、デリゲートのDLLEvent
の引数に含まれるDLLInterface
というDLL独自の型です。
このイベントに登録するメソッドを普通に作ろうとすれば
private void MyHandle( double[] data1, DLLInterface data2)
と作ると思うのですが。
最初に書いた、普通に参照してDLLで定義されたものをインスタンス化させることができないという問題のせいで、DLLInterface
を引数にすることができません。
とりあえずDLLInterface
の部分をobject
にしてやってみたのですが。
ターゲット メソッドとデリゲート型との間に、シグネチャまたはセキュリティ透過性の互換性がないため、ターゲット メソッドにバインドできません。
という例外がCreateDelegateで発生してしまいます。
色々検索してみたのですが解決方法がわからず困っています...
そもそも使い方が間違っているという可能性もありますが...
何か心当たり、知識がある方がいらっしゃいましたら
助言を頂けないでしょうか?お願いいたします。
###追記
問題が発生するアプリを作ってみました。
System.dll
が私が実際に使いたい他社製DLLの代わりです。
本来であればElapsedイベントの引数(Delegate?)は
(object sender, ElapsedEventArgs e)
なのでOnElapsed
も同様の引数にしたいところなのですが、
ElapsedEventArgs
がSystem.dll
内で定義されているものなのでそのまま使うことができません。
これを何とかして基底型?汎用型?のようなものからキャストしてデータを扱おうと思ったのですが、
そもそもイベントの登録ができない、というかデリゲートの作成ができなくて困っているという状況です。
分かりにくい質問で申し訳ありません、よろしくお願いいたします。
C#
1namespace ConsoleApp1 2{ 3 class Program 4 { 5 static object timer_instance = null; 6 static myClass c = null; 7 8 static void Main(string[] args) 9 { 10 c = new myClass(); 11 12 var a = Assembly.LoadFrom( "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\System.dll" ); 13 var type = a.GetType("System.Timers.Timer"); 14 timer_instance = Activator.CreateInstance(type, new object[]{ 100.0 }); 15 // Timer timer = new Timer() という風に使うことが出来ない状態 16 17 var event_info = type.GetEvent("Elapsed"); 18 var _delegate = Delegate.CreateDelegate(event_info.EventHandlerType, c, "OnElapsed"); 19 event_info.AddEventHandler(timer_instance, _delegate); 20 21 var method = type.GetMethod("Start"); 22 method.Invoke(timer_instance, null); 23 24 Task.Delay(1000000).Wait(); 25 } 26 } 27 28 class myClass 29 { 30 // ElapsedEventArgs 31 private void OnElapsed( object sender, object e ) 32 { 33 Console.WriteLine("test"); 34 } 35 } 36} 37
回答2件
あなたの回答
tips
プレビュー