2013-05-18 3 views
1

Я хотел бы спросить о двух вещах, о .NET исполняемых файлов:Генерация больших файлов в .NET

  1. .NET исполняемым в формате PE. Означает ли это, что адрес, сгенерированный компилятором CIL, начинается с начала файла (address+size_of_headers)? Или этот адрес используется только при выполнении изображения в памяти?

  2. Возможно ли сгенерировать (с помощью CIL-компилятора) исполняемый файл размером более 4 ГБ? Если да, что делает компилятор, если он должен вызывать метод от конца файла или ветки до байта выше предела 4 ГБ?

Это правда, что я никогда не видел ни одного исполняемого файла C# размером более 4 ГБ, я просто любопытство.

+0

«Адрес, сгенерированный компилятором CIL». О каком адресе вы говорите? – svick

+0

Адрес, помещенный после кода операции в выходной код. – user35443

+0

Какой код операции? Каждый код операции имеет свой собственный формат. – svick

ответ

2

Я думаю, вы запутываете, как работает CIL с тем, как работает собственный код.

С CIL код, находящийся в исполняемом файле, фактически не выполняется. Обычно (с настольным CLR и без ngen) CLR считывает CIL и генерирует фактический исполняемый код «на лету» (поэтому эта часть CLR называется «только во время компилятора»).

Операции с кодом CIL, такие как call, используют токены для ссылки на методы и другие элементы. В сгенерированном собственном коде они преобразуются в адрес родного кода для этого метода.

Коды, подобные br, содержат смещения относительно следующей инструкции CIL, и они могут прыгать только внутри текущего метода. На x86 они скомпилированы в такие команды, как jne, которые содержат смещения относительно следующей инструкции x86.

Но метаданные для метода описаны в таблице MethodDef, которая содержит ссылку на поток IL для этого метода в виде 4-байтового Relative Virtual Address (и RVAs также используются в других частях файла). Я думаю, это означает, что исполняемый файл не может быть размером более 4 ГБ.

Я попытался проверить это, создав большой исполняемый файл, используя Reflection.Emit. Но самое лучшее, что я мог сделать в своей системе с 8 ГБ оперативной памяти, - это создать файл размером 1,5 ГБ (который уже сделал компьютер непригодным из-за замены).

+0

Хорошо. Итак, скажем, что код методов больше 4 ГБ. Что сделает CIL? – user35443

+0

@ user35443 Я посмотрел еще, см. Править. – svick

+0

Благодарю! – user35443

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