2012-05-05 14 views
7

CまたはC++からWinRTオブジェクトへの動的(つまりリフレクションベースの)呼び出しを行いたいと思います。私は、実行時にwinmdファイルを利用できると仮定して、メソッドが何であり、何のパラメータを取るかを知ることができます。WinRTインターフェイスへの動的呼び出し

OLEオートメーションでは、実際の呼び出しにIDispatchを使用できました。ただし、WinRTオブジェクトはIDispatchをサポートしていません。どうすれば電話をかけることができますか?プロセッサのCOM呼び出し規約に従って、パラメータを動的に渡すことを可能にする、ある種のFFIライブラリが必要ですか?または、私は本当に静的なクラス/構造体宣言(C/C++用)が必要ですか?

:ターゲットシステムはメトロスタイルのアプリです。これは、禁止されたAPIを含むソリューションを排除します。

+0

有限の.winmdファイルがあります。独自のツールを使用して1つ1つのラッパーを生成するのはなぜですか。正規のリフレクションを使用できます。 – Ben

+0

winmdファイルのセットは有限ではありません:ユーザーが作成できるすべての "コンポーネントDLL"は新しいwinmdファイルを生成し、実行時にのみセット全体を知ることができます。しかし、はい - このオプションは私が "静的な"宣言を意味するものです。 –

+0

ラッパーアセンブリを生成するツールを作成し、実行時にツールを呼び出して新しいコンポーネントのラッパーを生成し、アセンブリを動的にロードしてからリフレクションを使用することができます。このツールは単独では便利です(実際には存在しない場合)。ユーザは新しいことを学ぶのではなく、既存のリフレクションの知識を活用することができます。 – Ben

答えて

2

チャクラのJavascriptエンジンがwinrtメタデータを使用しているのとまったく同じカバーの下に、CLRと同じように記述することができます。これらの言語の両方の予測は、実行時にAPIを検出し、これを実現するために低レベルのアセンブリを構築します。

これは多大な労力を要し、特に楽しいことではありませんが、技術的には絶対に可能です。ウィンドウのメタデータには、APIおよび構造体のスタブを作成するために必要なすべての情報が含まれています。

+0

あなたはそれがどのように達成されたか知っていますか?例えば。彼らはマシンコードをオンザフライで生成しますか?または、そのインタフェース用に設計されたいくつかのMS APIを使用しますか? –

+0

言い換えれば:正式なapi(IDispatchのようなもの)がありますか、何らかの形でマシンコードを生成する必要がありますか? (例えば、ffiライブラリを使用していますか?) –

+0

公式のAPIはありません。APIの表面に導入するオーバーヘッドのために、IDispatchのような機能をwinrtから意図的に削除しました(IDispatchベースのAPIは直接API呼び出しよりもはるかに遅い)。 CLRソリューションには既存のCLR RCWロジックの変種が含まれており、ChakraソリューションはRPCマーシャリングエンジンで使用されるものと似ています。これは「マシンコードの生成」は必要としませんが、CPU固有のスタックフレームの生成が必要です。 –

関連する問題