Параметры компилятора C#, которые управляют созданием кода

Следующие параметры управляют созданием кода в компиляторе. Новый синтаксис MSBuild выделен полужирным шрифтом. Для старого синтаксиса csc.exe используется формат code style.

  • DebugType / -debug: выдача (или невыдача) отладочных сведений.
  • Optimize / -optimize: включение оптимизаций.
  • Deterministic / -deterministic: создание эквивалентных (побайтовое сравнение) выходных данных для одного источника входных данных.
  • ProduceOnlyReferenceAssembly / -refonly: создание базовой сборки вместо полной сборки в качестве основного выходного файла.

DebugType

При использовании параметра DebugType компилятор создает отладочные сведения и помещает их в выходном файле или файлах. Сведения об отладке добавляются по умолчанию.

<DebugType>pdbonly</DebugType>

Для всех версий компилятора, начиная с C# 6.0, разницы между pdbonly и full нет. Выберите pdbonly. Чтобы изменить расположение файла с расширением .pdb, см. раздел PdbFile.

Допустимы следующие значения:

Значение Значение
full Выводить информацию об отладке в PDB-файл, используя стандартный формат для текущей платформы:
Windows: PDB-файл Windows.
Linux/macOS: переносимый PDB-файл.
pdbonly Эквивалентно full. Дополнительные сведения см. в примечании ниже.
portable Выводить информацию об отладке в PDB-файл, используя кроссплатформенный формат переносимого PDB-файла.
embedded Выводить информацию об отладке в файл DLL или EXE (PDB-файл не создается), используя формат переносимого PDB-файла.

Внимание

Следующая информация касается только компиляторов версии ниже C# 6.0. Значение этого элемента может быть либо full либо pdbonly. Аргумент full, действующий при отсутствии pdbonly, позволяет присоединить отладчик к выполняющейся программе. Определение pdbonly позволяет выполнять отладку исходного кода при запуске программы в отладчике, но при этом ассемблер отображается только при подключении выполняющейся программы к отладчику. Используйте этот параметр для создания отладочных сборок. При использовании параметра full нужно учитывать некоторое влияние на скорость и размер оптимизированного кода JIT и незначительное влияние на качество кода с full. Для создания кода выпуска рекомендуется использовать pdbonly или не использовать PDB. Разница между pdbonly и full заключается в том, что компилятор с full создает DebuggableAttribute, чтобы сообщить JIT-компилятору о доступности отладочных сведений. Поэтому если при использовании full код содержит DebuggableAttribute со значением false, вы получите сообщение об ошибке. Дополнительные сведения о настройке производительности отладки для приложения см. в разделе Упрощение отладки образов.

Оптимизация

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

<Optimize>true</Optimize>

Параметр Optimize можно задать на странице свойств сборки для проекта в Visual Studio.

Кроме того, параметр Optimize включает оптимизацию кода во время выполнения в общеязыковой среде выполнения. По умолчанию оптимизация отключена. Чтобы включить оптимизацию, укажите Optimize+. При создании модуля для сборки используйте те же настройки Optimize, что и для сборки. Параметры Optimize и Debug можно комбинировать.

Детерминированное

Указывает компилятору на необходимость создания сборки, чьи побайтовые выходные данные идентичны в разных компиляциях, если входные данные идентичны.

<Deterministic>true</Deterministic>

По умолчанию выходные данные компилятора из заданного набора входных данных уникальны, так как компилятор добавляет метку времени и MVID (a Module.ModuleVersionId). В основном это GUID, который однозначно идентифицирует модуль и версию.) создается из случайных чисел. Вы можете использовать параметр <Deterministic> для создания детерминированной сборки, двоичное содержимое которой идентично в разных компиляциях при условии, что входные данные не изменяются. В такой сборке поля timestamp и MVID будут заменены значениями, полученными из хэша всех входных данных компиляции. Компилятор рассматривает следующие входные данные, которые влияют на детерминированность:

  • Последовательность параметров командной строки.
  • Содержимое RSP-файла ответов в компиляторе.
  • Точная версия компилятора и его связанные сборки.
  • Текущий путь к каталогу.
  • Двоичное содержимое всех файлов явно передается компилятору напрямую или косвенно, включая:
    • Исходные файлы
    • Связанные сборки
    • Связанные модули
    • Ресурсы
    • Файл ключа строгого имени
    • Файлы ответов @
    • Анализаторы
    • Наборы правил
    • Другие файлы, которые могут использоваться анализаторами
  • Текущий язык и региональные параметры (для языка сообщений о диагностике и исключениях).
  • Кодировка по умолчанию (или текущая кодовая страница), если кодировка не указана.
  • Наличие, отсутствие и содержимое файлов на пути поиска компилятора (задается, например, с помощью -lib или -recurse).
  • Платформа общеязыковой среды выполнения (CLR), на которой выполняется компилятор.
  • Значение %LIBPATH%, которое может повлиять на загрузку зависимостей анализатора.

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

ProduceOnlyReferenceAssembly

Параметр ProduceOnlyReferenceAssembly указывает на то, что в качестве основных выходных данных должна быть выведена базовая сборка, а не сборка реализации. Параметр ProduceOnlyReferenceAssembly автоматически отключает вывод PDB, так как базовые сборки не могут выполняться.

<ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>

Базовые сборки являются особым типом сборки, которая содержит только минимальный объем метаданных, необходимый для представления общедоступного API библиотеки. Такие сборки включают в себя объявления для всех элементов, которые важны при указании ссылки на сборку в средствах сборки, но исключают все реализации элементов, а также объявления закрытых элементов, не имеющих наблюдаемого влияния на их контракт API. Дополнительные сведения см. в статье Базовые сборки.

Параметры ProduceOnlyReferenceAssembly и ProduceReferenceAssembly являются взаимоисключающими.