C ++ / CXでオブジェクトをイントロスペクトするにはどうすればよいですか?(IInspectableを使用して)クラス名を取得する方法は知っていましたが、メソッドの名前(文字列)だけを持っている場合、そのプロパティのリストを取得する方法やメソッドを呼び出す方法を理解できませんでした。こことGoogleで回答を検索しましたが、見つかったのはWinRTの.NETレイヤーに関連しています(System.Reflection名前空間はC ++ / CXでは使用できないようです)。
3 に答える
svickが示唆するように、クラス名(IInspectable :: GetRuntimeClassNameから取得)を取得して、RoGetMetaDataFileに渡します。これにより、IMetaDataImport2が返されます。次に、 IMetaDataImport2::FindTypeDefByNameを呼び出します。これはtypedefトークンを返します。次に、 IMetaDataImport2 :: GetTypeDefPropsを呼び出します。これにより、タイプに関するプロパティが提供されます。
typedefプロパティから、他の情報を取得できます。メソッド/フィールドがインターフェイス/構造体(または列挙型)の場合は列挙し、ランタイムクラスのタイプ(インターフェイスまたはクラスの場合)を検索します。
通常の.Netリフレクションのほとんどでさえ、WinRTアプリケーションで使用できる.Netのサブセットには含まれていません。また、 WinRTドキュメントでリフレクション関連のタイプは見つかりませんでした。これは、(私が何かを見落とした場合を除いて)リフレクションが利用可能なAPIによって単純に公開されないことを意味します。
なぜ利用できないのかわかりませんが。メタデータはそこにあり、それで十分なはずです。
C ++固有の関数を見ると、関数がありますRoGetMetaDataFile()
。メタデータを取得するためにそれを使用することは可能であるはずです。ただし、これはネイティブのC ++関数であり、C ++/CXではありません。これは、使い方が簡単ではないことを意味し(手動のメモリ管理など)、ストアにあるアプリで許可されるとは思えません。
C ++は、WinRTタイプに反映する特定のAPIを提供していません。これらのタイプは、CX準拠のメタデータファイルで完全に定義されており、CLRネイティブメタデータAPIを使用してそれらの定義を読み取ることができます。にスニペットがあります
James McNellisは、昨年、CXリフレクション用の完全なC++ライブラリをリリースしました。
http://seaplusplus.com/2012/04/26/cxxreflect-native-reflection-for-the-windows-runtime/