Компилятор.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++.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

Другие вопросы по тегам