Генератор кода .NET Delphi выдает IL в виде байт-кода непосредственно в память, во многом как генерация кода x86, хотя и с соответствующими заголовками и т. Д. То есть генератор кода напрямую генерирует байты, таблицы исключений и т. Д., Соответствующие кодированному формату IL.Это не делается с помощью API, а скорее по старинке: пишите код по байтам за раз.
Позже встроенный компоновщик Delphi работает с IMetaDataEmit
и т. Д. Для генерации метаданных.и IMetaDataEmit::SetRVA
, чтобы сообщить метаданным, где будет находиться код в исполняемом файле.Метаданные копируются с помощью IMetaDataEmit::SaveToMemory
, а затем копируются в PE, созданный компоновщиком, с соответствующим исправлением заголовка CLR, указывающего на начало метаданных.
Это большой код, некоторыеиз этого, так как он в значительной степени пронизан через существующий компоновщик x86 в Delphi, который выполняет такие вещи, как оптимизация веток и удаление неиспользуемого кода (умные ссылки), что, строго говоря, обычно не требуется для .NET.
Если бы нам пришлось делать все это снова, мы вполне могли бы избегать .NET API для создания метаданных и генерировать все это прямо из спецификации.API оказались «черным ящиком» для оптимизации и добавили значительное время компиляции.