Определите, были ли блоки.NET созданы из того же источника

Кто-либо знает о способе сравнить два блока.NET, чтобы определить, были ли они созданы из "тех же" исходных файлов?

Я знаю, что существуют некоторые differencing доступные утилиты, такие как плагин для Отражателя, но я не интересуюсь просмотром различий в GUI, я просто хочу автоматизированный способ сравнить набор двоичных файлов, чтобы видеть, были ли они созданы из того же (или эквивалентные) исходные файлы. Я понимаю, что несколько файлов другого источника могли произвести тот же IL, и понимать, что процесс только был бы чувствителен к различиям в IL, не первоисточнику.

Основное препятствие просто сравнению потоков байтов для этих двух блоков состоит в том, что.NET включает поле под названием "MVID" (Идентификатор Версии модуля) блок. Это, кажется, имеет другое значение для каждой компиляции, поэтому при создании того же кода дважды, блок будет отличаться.

Связанный вопрос, кто-либо знает, как вынудить MVID быть тем же для каждой компиляции? Это избежало бы нас бывший должный иметь процесс сравнения, который нечувствителен к различиям в значении MVID. Последовательный MVID был бы предпочтителен, поскольку это означает, что могли использоваться стандартные контрольные суммы.

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

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

Скорость во время выполнения решения для сравнения не особенно важна.

спасибо

29
задан Jeffrey Hantin 18 November 2010 в 06:27
поделиться

2 ответа

Есть несколько способов сделать это в зависимости от объема работы, которую вы готовы проделать, и важности производительности и/или точности. Один из способов, как указал Eric J., заключается в сравнении бинарных сборок, исключая части, которые изменяются при каждой компиляции. Это решение простое и быстрое, но может дать много ложных отрицательных результатов. Более эффективным способом является углубление сравнения с помощью отражения. Если производительность критична, вы можете начать со сравнения типов и, если они совпадают, перейти к определениям членов. После проверки определений типов и членов и если все совпадает, можно пойти дальше, изучив фактический IL каждого метода, получив его через метод GetILAsByteArray. И снова вы найдете различия, даже если все одинаково, но скомпилировано с немного другими флагами или другой версией компилятора. Я бы сказал, что лучшим решением будет использование инструментов непрерывной интеграции, которые помечают сборку номером changeset в вашем контроле исходников (вы ведь используете такой, верно?).

Связанная статья

3
ответ дан 28 November 2019 в 01:59
поделиться

Использование инструментов командной строки для фильтрации MVID и меток даты и времени из текстового представления IL не слишком болезненно. Предположим, что file1.exe и file2.exe созданы из одних и тех же источников:

c: \ temp> ildasm / all / text file1.exe | найти / v "Отметка времени и даты:" | найти / v "MVID"> file1.txt

c: \ temp> ildasm / all / text file2.exe | найти / v "Отметка времени и даты:" | find / v "MVID"> file2.txt

c: \ temp> fc file1.txt file2.txt

Сравнение файлов file1.txt и FILE2.TXT

FC: различий не обнаружено

10
ответ дан 28 November 2019 в 01:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: