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