Компилятор.NET - доступ / отражение метаданных сборки CLR из неуправляемого C++
У меня есть компилятор, предназначенный для среды выполнения.NET (CLR). Текущая версия компилятора написана на стандартном C++ (неуправляемом). В настоящее время компилятору не хватает поддержки ссылочных сборок во время компиляции, поэтому я "импортирую" библиотеки.NET с помощью утилиты-генератора заглушек, написанной на.NET, которая отображает любую сборку и выдает заглушку для нее на моем собственном языке., Я предварительно генерирую заглушки для всех сборок.NET, которые я использую. Во время компиляции мой компилятор компилирует заглушки для заполнения таблиц символов и т. Д., Чтобы он мог разрешать типы и методы из.NET API. Это моя версия "использования" . Однако это было временно, и теперь я хочу добавить фактическую директиву using или import в компилятор. Мне нужно получить доступ к метаданным / информации о типе в ссылочных сборках во время компиляции.
Мой вопрос: мне нужны предложения о том, как получить доступ к метаданным сборки CLR из неуправляемого C++. Или мне нужно обоснование, чтобы преобразовать его в управляемое приложение C++ и использовать поддержку отражения.NET. Цель чистого C++ состоит в том, что я также могу компилировать в Linux для Mono, плюс у меня также есть частичные бэкенды для другой среды выполнения, кроме CLR.
2 ответа
Я думаю, что это делается CoCreateObject() из класса CLSID_CorMetaDataDispenser, запрашивая интерфейс IID_IMetaDataDispenser. IMetaDataDispenser::OpenScope() позволяет открывать метаданные сборки. Запросите IID_IMetaDataAssemblyImport, у него есть несколько методов для итерации метаданных.
Не упустите.NET 4.0, он не за горами, и я уверен, что формат метаданных изменился. Хотя это должно быть проблемой только для генерации метаданных, чтение должно быть обратно совместимым, если вы получаете версию интерфейсов 4.0. <cor.h>
имеет CLSID для определенных классов версии метаданных.
Я предполагаю, что вас не интересует Ирония.
Это из статьи MSDN "CLR Inside Out: API хостинга CLR", август 2006 г.
int main (int argc, _TCHAR * argv []) { // Привязка к среде выполнения. ICLRRuntimeHost *pClrHost = NULL; HRESULT hrCorBind = CorBindToRuntimeEx( NULL, // Загрузить последнюю доступную версию CLR L"wks", // Рабочая станция GC (переопределение "wks" или "svr") 0, // флаги не нужны CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (PVOID *) & pClrHost); // Построить наш объект управления хостом. DHHostControl *pHostControl = новый DHHostControl (pClrHost); // Сообщаем CLR, что на этом хосте реализованы менеджеры хостинга. pClrHost-> SetHostControl (pHostControl); // Теперь запускаем CLR. HRESULT hrStart = pClrHost-> Start (); // Загрузить сборку и выполнить в ней метод. HRESULT hrExecute = pClrHost->ExecuteInDefaultAppDomain( pwzAssemblyPath, pwzAssemblyName, pwzMethodName, pwzMethodArgs, & RetVal); }
Существует еще одно MSDN "Расширенные методы для предотвращения и обнаружения взаимоблокировок в приложениях.NET", апрель 2006 г., с разделом "Разоблачение через API-интерфейсы хостинга", который также может помочь в объяснении того, как использовать API-интерфейсы для хостинга от код C/C++.
Надеюсь, это поможет, С наилучшими пожеланиями, Том.