Подтвердить что ты не робот

Почему ASP.NET Compiler восстанавливает все двоичные файлы в каждой сборке?

Когда я перекомпилирую свой проект (asp.net, С#) с aspnet_compiler, восстановленные бинарные файлы изменяются (по сравнению с предыдущей сборкой), даже если никаких изменений кода не было сделано.

Это, я понимаю, связано с тем, что сборка генерирует новый идентификатор версии модуля (guid) каждый раз, когда он строит (чтобы различать сборки), другой аналогичный вопрос говорит об этом: Могу ли я указать идентификатор версии модуля (MVID) при создании сборки .net?

Этот связанный вопрос, кажется, предполагает, что нет способа перестроить проект и иметь двоичные файлы в соответствии с предыдущей сборкой того же неизмененного кода. ОК, хорошо, я понимаю - но почему все двоичные файлы перестраиваются вообще

Я думаю, согласно документации (http://msdn.microsoft.com/en-us/library/ms229863(v=vs.80).aspx), что, если в качестве аргумента не указано значение -c, aspnet_compiler должен перестройте те бинарные файлы, которые на самом деле должны быть (из-за измененного кода). Я не понимаю или, возможно, что-то не хватает?

Аргументы aspnet_compiler, которые я использую:

aspnet_compiler -f -u -fixednames -nologo -v / -p .\myproject\ .\mybuild\

Обратите внимание, что эта проблема возникает только с проектом WebSite, а не с проектом Web Application (они скомпилированы по-разному). Также эта проблема возникает, даже если вы создаете проект и страницу WebSite без каких-либо функций и никогда не открываете его или не меняете его в любом случае между сборками.

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

4b9b3361

Ответ 1

Отметьте этот отличный ответ Эриком Липпертом о том, как компилятор С# делает несколько проходов для компиляции исходного кода. Могу ли я много причин, почему ваша сборка не была идентична предыдущей, хотя функциональность такая же.

  • Компиляторы заменяют специальные языковые функции, такие как использование блока с эквивалентами IL
  • Компиляторы делают много оптимизаций для вашего кода, каждая итерация может давать немного другой результат.
  • Составители должны создавать материализованные имена для анонимных имен методов, и они различаются при каждом компиляции
  • И еще много причин, по которым вы легко могли бы это понять, используя dis-ассемблер

Проверьте эти дизассемблеры и декомпилируйте свою библиотеку или исполняемый файл, чтобы получить лучшее понимание.
http://ilspy.net/, http://www.telerik.com/products/decompiler.aspx

Ответ 2

Я нашел во многих случаях использование aspnet_compiler, особенно в ситуациях, когда мои проекты имеют ссылки на другой проект в том же решении, что приводит к полным перестроениям, которые часто трудно объяснить. (хотя несколько раз, что я исследовал, произошли "изменения", даже если они действительно не влияют на такие изменения, как изменения в пробелах, комментарии и т.д.)

У меня также были проблемы с рядом плагинов в visual studio, которые сделали все, от манипулирования таблицами и другим пробелом, фактическим файлом проекта и т.д. Хотя эти изменения не имеют заметных изменений для нас, людей, компилятор принимает один взгляд и идет "Я вижу изменение! ОТСУТСТВУЕТ ВСЕ ВЕЩИ!!!"

Не уверен, что мой ответ - любая помощь, но я бы отключил ваши плагины, запустил компилятор, а затем снова запустил компилятор и посмотрел, что произойдет...