2010-07-11 3 views
6

Я пытаюсь создать бэкэнд моего языка для платформы .NET. Интерфейс и интерпретатор, написанные на Delphi. Неуправляемый API просто позволяет определять типы, но не выделяет MSIL.Какие способы создания MSIL из неуправляемого кода

Какие существуют способы генерации MSIL из неуправляемого кода? Без использования Reflection.Emit и использование ILasm для достижения этого? Спасибо.

ответ

5

Генератор кода .NET .NET Delphi испускает IL как байт-код непосредственно в память, подобно генерации кода x86, хотя с соответствующими заголовками и т. Д. То есть генератор кода напрямую испускает байты, таблицы исключений и т. Д., Соответствующие кодированному IL-формату , Он не делает этого с API, а скорее старомодным способом: напишите код байтом за раз.

Позже встроенный компоновщик Delphi работает с IMetaDataEmit и т. Д. Для генерации метаданных и IMetaDataEmit::SetRVA, чтобы сообщить метаданные, где код будет размещен в исполняемом файле. Метаданные копируются с IMetaDataEmit::SaveToMemory, а затем копируются в PE, который компоновщик компонует, с заголовком CLR, соответствующим образом исправленным, чтобы указать на начало метаданных.

Это очень много кода, некоторые из них смутно, так как это большая часть из них связана с существующим x86-компоновщиком Delphi, который делает такие вещи, как оптимизация ветвей и исключение неиспользуемого кода (умная привязка), которая, строго говоря, вообще не является необходимо для .NET.

Если мы должны были все это сделать, мы могли бы очень избегать .NET API для создания метаданных и генерировать все это прямо из спецификации. API-интерфейсы оказались черным ящиком для оптимизации и добавили значительную часть времени компиляции.

+0

Спасибо, Барри. –

3

От неудовлетворительно код? TBH, лучшее предложение, которое у меня есть, - это либо «использовать P/Invoke», либо «выяснить, что он предназначен, и повторить его».

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

+1

Мне нужен API, который позволяет мне напрямую издать MSIL (чтение из родного Delphi) с использованием маршалинга с управляемым управлением (Pinvoke, reverse pinvoke, IJW, COM). Вы предлагаете мне самостоятельно собирать файлы PE? –

2

Вам сложно. Библиотеки инфраструктуры Иронии и Common Compiler, доступные на Codeplex.com, отсутствуют, они предназначены для компиляторов, реализованных в управляемом коде. Следующая опция - использование неуправляемых интерфейсов метаданных, таких как IMetaDataAssemblyEmit, IMetaDataAssemblyImport, IMetaDataEmit2. Однако эти COM-интерфейсы объявлены в заголовочном файле cor.h SDK, подходящем только для использования программой C/C++. Для них нет библиотеки типов. Короче говоря, кропотливое копирование деклараций интерфейса, вам понадобится какой-то инструмент для преобразования этих данных в объявления Delphi. Не уверен, что это существует.

+1

Я перевел (cor.h corhdr.h) в pas файлы вручную 2 дня назад. Таким образом, Unmanaged API доступен для встроенного внешнего интерфейса моего компилятора. Но API не поддерживает выдачу MSIL для реализации метода. –

+0

ICeeGen устарел. Я не знаю о замене. –

2

MSIL или CIL по существу эквивалент .Net машинный код. Когда вы разбираете язык и переводите его в машинный код, у вас есть компилятор . Ранние компиляторы на любом языке обычно генерируют свой машинный код вручную. То есть для каждого типа команды или выражения на исходном языке напишите «шаблон» инструкций ассемблера для его перевода. Когда вы работаете через промежуточное представление программы, выберите соответствующий шаблон, заполните детали программы и испустите CIL. Для языка на основе стека, такого как CIL, достаточно просто объединить шаблоны из нескольких операторов; выходной стек одного оператора - это входной стек для следующего.

Вы должны ознакомиться с CIL instruction set.

Тот факт, что ваш компилятор неуправляемый код не имеет значения. Вы можете генерировать текст CIL из любой требуемой программы. Когда он будет готов, отправьте его через ilasm, чтобы создать сборку.

+0

Роб, я прочитал ECMA335, а также «Expert .NET 2.0» Сержа Лидина 3 года назад. (Так что ilAsm - это всего лишь мой друг). Роб, ты можешь спросить Барри Келли или может быть Remobjects ребята, как они решают эту проблему. Или, возможно, все они используют смешанный режим C++. –

+0

Prism компилятор построен с Prism и является 100% -ным .NET-приложением. –

+0

Спасибо, Роберт. –

Смежные вопросы