Как всегда производить байт для байта, который идентичные .exe на восстанавливают приложения C#?

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

class C {
  T a;
public:
  C(T a): a(a) {
this->a.sort ;//correct
a.sort();//will not affect the actual member variable
}
};
18
задан Jeffrey Hantin 21 January 2014 в 08:50
поделиться

5 ответов

Обновление: похоже, что у Roslyn есть флаг компилятора / feature :terministic для воспроизводимых сборок, хотя он еще не работает на 100% .


Вы сможете избавиться от GUID отладки, отключив создание PDB. В противном случае установка GUID в нули - это нормально - этот раздел просматривают только отладчики (вы больше не сможете отлаживать сборку, но она все равно должна работать нормально).

PrivateImplementationDetails немного сложнее - они - это внутренние вспомогательные классы, генерируемые компилятором для определенных языковых конструкций (инициализаторы массивов, операторы переключения с использованием строк и т. д.). Поскольку они используются только для внутреннего использования, имя класса на самом деле не имеет значения, поэтому вы можете просто присвоить им порядковый номер.

Я бы сделал это, просмотрев поток метаданных #Strings и заменив все строки формы « {GUID}» на « {порядковый номер, дополненный до такой же длины, как GUID}».

Поток метаданных #Strings - это просто список строк, используемых метаданными, закодированных в UTF-8 и разделенных \ 0; поэтому поиск и замена имен должны быть легкими, если вы знаете, где находится поток #Strings внутри исполняемого файла.

К сожалению, «заголовки потока метаданных», содержащие эту информацию, довольно скрыты внутри формата файла. Вам нужно будет начать с необязательного заголовка NT, найти указатель на заголовок времени выполнения CLI, разрешить его в позицию файла, используя таблицу раздела PE (это RVA, но вам нужна позиция внутри файла),

5
ответ дан 30 November 2019 в 09:32
поделиться

Я не уверен в этом, но просто подумал: используете ли вы какие-либо анонимные типы, для которых компилятор может генерировать имена за кулисами, которые могут быть разными при каждом запуске компилятора? Просто возможность, которая пришла мне в голову. Вероятно, для Джона Скита; -)

Обновление: Возможно, вы также можете использовать надстройки Reflector для сравнения и разборки.

2
ответ дан 30 November 2019 в 09:32
поделиться

Что касается проблемы GUID PDB, если вы укажете, что PDB не должен создаваться при компиляции для сборок Release, будет ли двоичный файл по-прежнему содержать GUID файловой системы PDB?

Чтобы отключить PDB генерация:

  1. Щелкните правой кнопкой мыши проект в обозревателе решений и выберите «Свойства».
  2. В меню слева выберите «Сборка».
  3. Убедитесь, что для параметра Configuration выбрано значение Release (вам все равно понадобится PDB для отладки).
  4. Нажмите кнопку «Дополнительно» в правом нижнем углу.
  5. В разделе «Информация о выводе / отладке» выберите «Нет».

Если вы строите из консоли, используйте / debug-, чтобы получить тот же результат.

2
ответ дан 30 November 2019 в 09:32
поделиться

Взгляните на ответы на этот вопрос. Особенно на внешнюю ссылку, представленную в 3-м.

РЕДАКТИРОВАТЬ:

Я действительно хотел дать ссылку на эту статью.

1
ответ дан 30 November 2019 в 09:32
поделиться

Вы сказали, что после нескольких настроек проекта вы смогли заставить приложения C ++ повторно компилироваться с одинаковыми значениями SHA1 / MD5. Я нахожусь в той же лодке, что и вы, будучи в отрасли со сторонней тестовой лабораторией, которой необходимо повторно создавать точно такие же исполняемые файлы.

Изучая, как это сделать в VS2005, я наткнулся на ваш пост здесь. Не могли бы вы поделиться настройками проекта, которые вы сделали, чтобы приложения на C ++ всегда строились с одинаковыми значениями SHA1 / MD5? Это было бы большим подспорьем для меня и, возможно, для всех, кто разделяет это требование.

0
ответ дан 30 November 2019 в 09:32
поделиться
Другие вопросы по тегам:

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