если формальный параметр и участника называют, то же тогда остерегается использования этого указателя внутреннего конструктора для использования членской переменной
class C {
T a;
public:
C(T a): a(a) {
this->a.sort ;//correct
a.sort();//will not affect the actual member variable
}
};
Обновление: похоже, что у Roslyn есть флаг компилятора / feature :terministic
для воспроизводимых сборок, хотя он еще не работает на 100% .
Вы сможете избавиться от GUID отладки, отключив создание PDB. В противном случае установка GUID в нули - это нормально - этот раздел просматривают только отладчики (вы больше не сможете отлаживать сборку, но она все равно должна работать нормально).
PrivateImplementationDetails немного сложнее - они - это внутренние вспомогательные классы, генерируемые компилятором для определенных языковых конструкций (инициализаторы массивов, операторы переключения с использованием строк и т. д.). Поскольку они используются только для внутреннего использования, имя класса на самом деле не имеет значения, поэтому вы можете просто присвоить им порядковый номер.
Я бы сделал это, просмотрев поток метаданных #Strings и заменив все строки формы «
Поток метаданных #Strings - это просто список строк, используемых метаданными, закодированных в UTF-8 и разделенных \ 0; поэтому поиск и замена имен должны быть легкими, если вы знаете, где находится поток #Strings внутри исполняемого файла.
К сожалению, «заголовки потока метаданных», содержащие эту информацию, довольно скрыты внутри формата файла. Вам нужно будет начать с необязательного заголовка NT, найти указатель на заголовок времени выполнения CLI, разрешить его в позицию файла, используя таблицу раздела PE (это RVA, но вам нужна позиция внутри файла),
Я не уверен в этом, но просто подумал: используете ли вы какие-либо анонимные типы, для которых компилятор может генерировать имена за кулисами, которые могут быть разными при каждом запуске компилятора? Просто возможность, которая пришла мне в голову. Вероятно, для Джона Скита; -)
Обновление: Возможно, вы также можете использовать надстройки Reflector для сравнения и разборки.
Что касается проблемы GUID PDB, если вы укажете, что PDB не должен создаваться при компиляции для сборок Release, будет ли двоичный файл по-прежнему содержать GUID файловой системы PDB?
Чтобы отключить PDB генерация:
Если вы строите из консоли, используйте / debug-, чтобы получить тот же результат.
Взгляните на ответы на этот вопрос. Особенно на внешнюю ссылку, представленную в 3-м.
РЕДАКТИРОВАТЬ:
Я действительно хотел дать ссылку на эту статью.
Вы сказали, что после нескольких настроек проекта вы смогли заставить приложения C ++ повторно компилироваться с одинаковыми значениями SHA1 / MD5. Я нахожусь в той же лодке, что и вы, будучи в отрасли со сторонней тестовой лабораторией, которой необходимо повторно создавать точно такие же исполняемые файлы.
Изучая, как это сделать в VS2005, я наткнулся на ваш пост здесь. Не могли бы вы поделиться настройками проекта, которые вы сделали, чтобы приложения на C ++ всегда строились с одинаковыми значениями SHA1 / MD5? Это было бы большим подспорьем для меня и, возможно, для всех, кто разделяет это требование.