RCWを使用せずにCOMオブジェクトメソッドを呼び出す最も速い方法
-
03-07-2019 - |
質問
私は、COMオブジェクトメソッドを呼び出すための最もクリーンで最速の方法を見つけようとしています。
オブジェクトにRCWを使用していましたが、サードパーティのCOMオブジェクトの新しいバージョンがGUIDを変更するたびにRCWが役に立たなくなるため、変更して使用を開始する必要がありました
Type mytype = Type.GetTypeFromProgID("MyCOMApp.Application");
COMオブジェクトの新しいバージョンがリリースされるたびに、アプリを再コンパイルおよび再デプロイする必要がなくなります。
現時点では、 mytype.InvokeMemeber
のようなリフレクションを使用していますが、RCWを呼び出すのに比べて非常に遅いと感じています。
サードパーティのCOMオブジェクトのバージョンを変更し、RCWの速度を維持するという問題に誰もがどのように取り組んでいますか?
解決
リフレクションでの呼び出しを簡単にしたい場合は、VB.NETを使用して、Object型の変数で遅延呼び出しを行うことができます。 VB.NETは、リフレクションの呼び出しを支援します。また、Microsoft.VisualBasic.dllへの参照を設定し、CallByNameを呼び出して、リフレクション呼び出しを支援することもできます。
ただし、変更されるのはIID(インターフェイスGUID)またはクラスGUIDですか?変更されるのがクラスGUIDである場合、インターフェイスを1回定義してから、GetTypeFromProgIDを呼び出してTypeを取得できます。それが得られたら、ActivatorクラスのCreateInstanceメソッドに型を渡し、インターフェイスにキャストできます。これは変更されません。
ただし、IIDが変更された場合は、毎回リフレクションを使用する必要があります。