WinRT Reflection (C ++ / CX) - PullRequest
       48

WinRT Reflection (C ++ / CX)

4 голосов
/ 26 сентября 2011

как я могу исследовать объект в C ++ / CX? Я знал, как получить имя его класса (используя IInspectable), но я не смог понять, как получить список его свойств или как вызывать методы, если у меня есть только имя метода (строка). Я искал ответ здесь и в Google, но обнаружил, что он связан со слоем .NET WinRT (пространство имен System.Reflection, по-видимому, недоступно в C ++ / CX).

Ответы [ 3 ]

5 голосов
/ 26 сентября 2011

Как подсказал svick, вы берете имя класса (полученное из IInspectable :: GetRuntimeClassName) и передаете его в RoGetMetaDataFile. Это возвращает IMetaDataImport2 . Теперь вызовите IMetaDataImport2 :: FindTypeDefByName . Это возвращает токен typedef. Теперь вызовите IMetaDataImport2 :: GetTypeDefProps , который даст вам свойства о типе.

Из свойств typedef вы можете получить другую информацию - перечислить методы / поля, если это интерфейс / структура (или перечисление), найти тип класса времени выполнения (если это интерфейс или класс) и т. Д.

1 голос
/ 23 августа 2013

C ++ не предоставляет никаких специальных API для отражения типов WinRT, эти типы полностью определены в файлах метаданных, совместимых с CX, и вы можете использовать API-интерфейсы собственных метаданных CLR для чтения их определения. В

есть фрагмент

http://social.msdn.microsoft.com/Forums/windowsapps/en-US/211ef583-db11-4e55-926b-6d9ab53dbdb4/ccx-reflection

Джеймс МакНеллис выпустил полную библиотеку C ++ для отражения CX в прошлом году

http://seaplusplus.com/2012/04/26/cxxreflect-native-reflection-for-the-windows-runtime/

1 голос
/ 26 сентября 2011

Даже большинство нормальных отражений .Net не входит в подмножество .Net, доступное для приложений WinRT.И я не нашел никаких относящихся к отражению типов в документации WinRT .Это означает, что (если я что-то упустил) отражение просто не доступно доступным API.

Хотя я не понимаю, почему оно не должно быть доступно.Есть метаданные, которых должно быть достаточно.

При взгляде на специфичные для C ++ функции есть функция RoGetMetaDataFile().Кажется, можно использовать его для получения метаданных.Но это нативная функция C ++, а не C ++ / CX.Это означает, что его нелегко использовать (ручное управление памятью,…), и я сомневаюсь, что это будет разрешено в приложениях, которые находятся в Магазине.

...