2016-07-05 18 views
0

私はCOMオブジェクトを扱っています。実行時にReflectionでプロパティとメソッドを検索し、COMオブジェクトの構造にほぼ一致する入力文字列に基づいて呼び出す必要があります。私は現在、obj.GetType().InvokeMember()を使用して、実行時にCOMオブジェクトのプロパティを歩いて、再帰的なアルゴリズムを使用していますが、私は必ずしもそうではありません正確プロパティやメソッド名を、供給していた場合、これが唯一の作品Reflection経由でCOMオブジェクトメンバーを検索

。例:

"ALPha.BETa.GAMMA?" - >var gamma = comObj.ALPha.BETa.GAMma;
"ALP.BET.GAM?" - >var gamma = comObj.ALPha.BETa.GAMma;
"ALP.BET.GAM 200" - >comObj.ALPha.BETa.GAMma = 200;
"ALPha.DELta" - >comObj.ALPha.DELta();

(誰がSCPIに精通だ場合、これは私が実際に働いているものです - にしよう動的に)実行時にCOMオブジェクトのAPIへの呼び出しにSCPI文字列を変換


ストレイ所見:

  • typeof(IComObject).GetProperties()はプロパティのみを返します以前は実行時に評価されていたもので、私には役に立たないものです。
  • Intellisenseは、COMオブジェクトのすべてのプロパティとメソッドで完全に使用できます。
  • デバッガでは、の型が実行時にSystem.__ComObjectと表示されます。
  • 私は、COMタイプライブラリexeでTlbimp.exeを実行して、interopアセンブリを作成しようとしましたが、GetProperties()を使用した場合と同じ結果が表示されます。
  • COMオブジェクトには少なくとも200のプロパティとメソッドがありますので、手動でマッピングを構築する方法はありません。
+1

リフレクションは.NETの機能であり、COMの機能ではありません。それが終わるところです。この製品では、命名規則がまったく使用できません.POWer.LEVel.IMMediate.AMPLitudeはちょっと奇妙です。しかし、おそらく、その狂気には、大文字の文字が1つずつ、不平を言い止めるまで、ある種の韻があります。 –

+0

Intellisenseを実装するために、Visual Studioはコンパイル時にCOMオブジェクトのメンバーをどのように知っていますか? Reflectionを使用して実行時にメンバーを列挙して検索するために、このような振る舞いを再現する方法はありませんか? – Brett

+0

* "私はCOMタイプライブラリexeでInteropアセンブリを生成するためにTlbimp.exeを実行しようとしましたが、' GetProperties() '" *を使うときと同じ結果が表示されます。 tlbimp.exeによって生成されたアセンブリ? –

答えて

1

@HansPassantコメントを拡張すると、COMはリフレクションを実行しません。レイトバインディングCOM(IDispatch経由)は、完全な文字列一致で行われます。おそらくあなたの最善の策は、自分でタイプライブラリをデコードすることです(私はthis toolで始まります)、文字列からメソッドとプロパティへの手動マッピングを構築することでしょう。 (はい、手動でリフレクションを再実装しています)。

+0

それは私の側に余分な仕事をたくさん追加して以来、私が望んでいた答えではありませんでしたが、情報に感謝します。 – Brett

関連する問題