Источник, скомпилированный с помощью vs2008, создает двоичный файл, который отличается от того же источника, скомпилированного непосредственно csc в командной строке

Я не могу понять, почему, если я скомпилирую тот же источник с Visual Studio 2008 (MSBuild), а затем с помощью csc (или NANT) в командной строке, я не могу получить точно такой же двоичный файл (тот же сборка).

Командная строка такая же, как и в Visual Studio, потому что я копирую команду из окна вывода, а затем вставляю ее в командную строку vs2008.

Я знаю, что если я компилирую один и тот же источник в разное время, я получаю другой двоичный файл из-за отметок времени в метаданных сборки. Фактически, если я сравниваю два двоичных файла, созданных vs2008 в разное время, я заметил небольшую разницу между двоичными данными.

Но если я скомпилирую с vs, а затем с csc, двоичные файлы будут очень разными! Ты знаешь почему? Что случилось?


person Lorenzo Melato    schedule 13.06.2009    source источник
comment
Чем они отличаются?   -  person Jim Arnold    schedule 13.06.2009
comment
Что делать, если вы дизассемблируете свои сборки с помощью ildasm.exe (из командной строки Visual Studio)? Вы можете сохранить дамп и сравнить его.   -  person Dirk Vollmar    schedule 13.06.2009


Ответы (4)


Нет никакой гарантии, что какой-либо конкретный порядок метаданных создается компилятором. Тем не менее, нет ничего преднамеренно вызывающего различный порядок между внутрипроцессным компилятором и csc.exe.

person Community    schedule 27.06.2009

Очень смелая догадка, но, возможно, переменные среды в VS IDE и в вашем терминале не совпадают. В худшем случае, возможно, ваша версия терминала связана с другой платформой .NET или, по крайней мере, с парой других библиотек / файлов кода или переключателями компилятора?

person merkuro    schedule 13.06.2009
comment
@Scott: проблема с отметкой времени объясняет, почему сборка двух двоичных файлов в разное время приводит к слегка разным двоичным файлам, но не почему двоичные файлы, созданные из командной строки, очень отличаются от VS единицы. - person Jon Skeet; 14.06.2009

Вы не сказали, создаете ли вы отладочную или двоичную сборку в Visual Studio. Я не уверен, что значение по умолчанию для командной строки совпадает с любым из них.

Попробуйте создать с явными переключателями /debug и /o (установите их так, как вы хотите) и сопоставьте их в Visual Studio. Также определите символы DEBUG и / или TRACE, если они определены в конфигурации сборки Visual Studio.

person Jon Skeet    schedule 13.06.2009

@ Marc Gravell, Divo, Jon: Я попытался разобрать две сборки с помощью ILDASM. После глубокого анализа и сравнения я увидел, что содержимое IL точно такое же, но все классы и методы, средства получения и установки свойств и т. Д. Находятся в совершенно другом порядке в сборке! Итак, если я сравниваю две сборки с шестнадцатеричным редактором / компаратором, я вижу совершенно другое двоичное тело!

Теперь мне нужно понять, почему VS и Csc по-разному взаимодействуют с компилятором!

У вас есть ссылка на документ, объясняющий эти два подхода?

person Lorenzo Melato    schedule 14.06.2009