Получение метаданных для компиляции языка .net - PullRequest
2 голосов
/ 24 марта 2011

Я занимаюсь проверкой концепции нового языка для платформы .Net. У меня есть вещи с лексингом / парсером, которые в значительной степени отсортированы. Я просто ленивый, я просто собираюсь сгенерировать C # с использованием CodeDom, а не испускать IL на этом этапе, а затем просто скомпилировать это.

Однако, чтобы сгенерировать правильный C # для моего синтаксиса, мне нужно иметь все метаданные ссылочных сборок, доступные для «компилятора», чтобы я мог искать все классы, методы, параметры, интерфейсы и т. Д. Какой лучший способ пойти по этому поводу.

Полагаю, я мог бы загрузить все сборки в их собственный домен приложений и запросить их через отражение, но это кажется немного неуклюжим. Другой способ, который, я думаю, состоит в том, чтобы извлечь все метаданные во что-то, что можно легко и качественно загрузить и запросить.

Другим способом было бы загрузить файлы метаданных XML из системного каталога .Net framework, но это тоже выглядит немного неуклюже

Кажется, это должно быть проблемой, которую должен решать сам компилятор по умолчанию, я что-то упускаю из-за этого очевидного способа сделать это?

EDIT

Эти метаданные CCI могут быть способом сделать это, но все же любопытно, как это делает компилятор

Ответы [ 4 ]

1 голос
/ 07 июля 2011

Компиляторы C # и VB имеют внутреннюю библиотеку, которая считывает метаданные из формата PE и интерпретирует их в необработанном виде.Я думаю, что многие из управляемых библиотек делают то же самое - формат метаданных открыт и хорошо документирован (просто ищите спецификации CLI ECMA), это более безопасно, чем проходить через CLR (так как код читается как биты и не загружается ввремя выполнения) и, как правило, быстрее.

Если / когда команды заканчивают свои долгосрочные планы «компилятор как услуга», возможно, что-то действительно доступно непосредственно от команды компилятора, но это:) будет в какое-то неопределенное и неопределенное время в будущем, и б) чисто домыслы с моей стороны.Итак, сейчас я бы посмотрел на некоторые библиотеки, на которые указывают другие люди.

0 голосов
/ 25 марта 2011

Лучший способ для полностью управляемых библиотек - использовать Cecil , как описано на странице проекта:

На простом английском, с Сесилом, вы можете загрузить существующие управляемые сборки, просмотреть все содержащиеся типы, изменить их на лету и сохранить обратно в диск модифицированной сборки.

Он поддерживается, с открытым исходным кодом и лицензия делает его пригодным для использования даже в коммерческих проектах.

0 голосов
/ 02 апреля 2011

Компиляторы обычно загружают сборки как любой другой файл данных (используя что-то вроде уже упомянутых библиотек метаданных Cecil или CCI). Он быстрее и использует меньше памяти, чем поддержка отражений во время выполнения.

0 голосов
/ 24 марта 2011

Вы можете попробовать Assembly.ReflectionOnlyLoad.Это будет загружать только запрошенную сборку, без загрузки зависимостей.Однако выгрузка все еще невозможна (без выгрузки всего домена приложения).

...