2009-06-13 2 views
1

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

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

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

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

+0

Что поделаешь? –

+0

Что делать, если вы разбираете сборки с помощью ildasm.exe (из командной строки Visual Studio)? Вы можете сохранить дамп и разделить его. –

ответ

1

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

0

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

+0

это проблема с меткой времени –

+0

@Scott: проблема с меткой времени объясняет, почему создание двух двоичных файлов в разное время дает * слегка * разные двоичные файлы, но не почему двоичные файлы, созданные из командной строки, * очень * отличаются от VS. –

0

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

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

0

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

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

У вас есть ссылка на документ, который объясняет два вопроса?