Поделиться через


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

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

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

ТипОтладки

При использовании параметра 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-компилятору о доступности отладочных сведений. Поэтому если при использовании DebuggableAttribute код содержит со значением false, вы получите сообщение об ошибке. Дополнительные сведения о настройке производительности отладки для приложения см. в разделе Упрощение отладки образов.

Оптимизация

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

<Optimize>true</Optimize>

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

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

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

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

<Deterministic>true</Deterministic>

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

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

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

ProduceOnlyReferenceAssembly

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

<ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>

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

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