Почему DLL-файлы .net, сгенерированные для одного и того же кода и одной и той же версии .net Framework, не являются бинарными идентичными? - PullRequest
2 голосов
/ 14 апреля 2011

У меня есть проект на C #, который при компиляции на разных машинах генерирует dll, которые не равны двоично.Итак, мой вопрос, почему сгенерированные DLL отличаются?и есть ли какой-нибудь способ получить точно такую ​​же dll, сгенерированную на разных машинах?

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

По некоторым причинам код должен быть скомпилирован на клиентской машине,Поэтому цифровая подпись не вариант.

1 Ответ

4 голосов
/ 14 апреля 2011

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

Если вам нужно сравнить, вам нужно подписать сборку (строгое наименование) и сравнить маркер открытого ключа плюс версию сборки.


UPDATE

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

Чтобы ответить на ваш вопрос, , если вы настаиваете на компиляции на клиенте, каждый раз, когда вы компилируете, создаете локальный хеш и сохраняете его в реестре, каком-то файле и т. Д., А затем сравниваете этот хеш.


ОБНОВЛЕНИЕ 2

Компилятор C # никогда не гарантирует, что он создаст один и тот же двоичный файл. Многие вещи создаются во время компиляции, например, именование анонимных функций, резервное значение для автоматических свойств, анонимные методы, внутренние GUID ... все это будет создано во время компиляции, и пока компилятор использует соглашение об именах, имена которого обычно заканчиваются то же самое, не гарантируется .

...