Opções do compilador C# que controlam a geração de código

As opções a seguir controlam a geração de código pelo compilador. A nova sintaxe do MSBuild é mostrada em negrito. A sintaxe csc.exe mais antiga é mostrada em code style.

  • DebugType / -debug: Emita (ou não emite) informações de depuração.
  • Otimizar / -optimize: habilite otimizações.
  • Determinística / -deterministic: Produz saída equivalente byte por byte da mesma fonte de entrada.
  • ProduceOnlyReferenceAssembly / -refonly: Produza um assembly de referência, em vez de um assembly completo, como a saída primária.

DebugType

A opção DebugType faz com que o compilador gere informações de depuração e as coloque no arquivo ou arquivos de saída. As informações de depuração são adicionadas por padrão.

<DebugType>pdbonly</DebugType>

Para todas as versões do compilador começando com C# 6.0, não há diferença entre pdbonly e full. Escolha pdbonly. Para alterar o local do arquivo .pdb , consulte PdbFile.

Os seguintes valores são válidos:

Value Significado
full Emita informações de depuração para o arquivo .pdb usando o formato padrão para a plataforma atual:
Windows: Um arquivo pdb do Windows.
Linux/macOS: Um arquivo PDB portátil.
pdbonly O mesmo que full. Consulte a nota abaixo para obter mais informações.
portable Emita informações de depuração para o arquivo .pdb usando o formato PDB portátil multiplataforma.
embedded Emita informações de depuração para o próprio .dll/.exe (o arquivo .pdb não é produzido) usando o formato PDB portátil.

Importante

As informações a seguir se aplicam somente a compiladores anteriores ao C# 6.0. O valor deste elemento pode ser ou fullpdbonly. O argumento completo , que estará em vigor se você não especificar pdbonly, permite anexar um depurador ao programa em execução. A especificação de pdbonly permite a depuração do código-fonte quando o programa é iniciado no depurador, mas só exibirá o assembler quando o programa em execução estiver conectado ao depurador. Use esta opção para criar compilações de depuração. Se você usa Full, esteja ciente de que há algum impacto na velocidade e tamanho do código otimizado JIT e um pequeno impacto na qualidade do código com full. Recomendamos pdbonly ou nenhum PDB para gerar código de versão. Uma diferença entre pdbonly e full é que com full o compilador emite um DebuggableAttribute, que é usado para dizer ao compilador JIT que as informações de depuração estão disponíveis. Portanto, você receberá um erro se o código contiver o DebuggableAttribute conjunto como false se você usar full. Para obter mais informações sobre como configurar o desempenho de depuração de um aplicativo, consulte Tornando uma imagem mais fácil de depurar.

Otimização

A opção Otimizar habilita ou desabilita otimizações executadas pelo compilador para tornar seu arquivo de saída menor, mais rápido e mais eficiente. A opção Otimizar está habilitada por padrão para uma configuração de compilação de versão . Ele está desativado por padrão para uma depuração e qualquer outra configuração de compilação.

<Optimize>true</Optimize>

Você define a opção Otimizar na página de propriedades Build para seu projeto no Visual Studio.

Otimize também informa o common language runtime para otimizar o código em tempo de execução. Por padrão, as otimizações são desabilitadas. Especifique Otimize+ para habilitar otimizações. Ao criar um módulo a ser usado por um assembly, use as mesmas configurações de Otimize usadas pelo assembly. É possível combinar as opções Otimizar e Depurar.

Determinística

Faz com que o compilador produza um assembly cuja saída byte por byte é idêntica entre compilações para entradas idênticas.

<Deterministic>true</Deterministic>

Por padrão, a saída do compilador de um determinado conjunto de entradas é exclusiva, uma vez que o compilador adiciona um carimbo de data/hora e um MVID (um Module.ModuleVersionId. Basicamente, é um GUID que identifica exclusivamente o módulo e a versão.) que é gerado a partir de números aleatórios. Você usa a <Deterministic> opção para produzir um assembly determinístico, cujo conteúdo binário é idêntico entre compilações, desde que a entrada permaneça a mesma. Nessa compilação, os campos timestamp e MVID serão substituídos por valores derivados de um hash de todas as entradas de compilação. O compilador considera as seguintes entradas que afetam o determinismo:

  • A sequência de parâmetros de linha de comando.
  • O conteúdo do arquivo de resposta .rsp do compilador.
  • A versão precisa do compilador usado e seus assemblies referenciados.
  • O caminho do diretório atual.
  • O conteúdo binário de todos os arquivos explicitamente passados para o compilador direta ou indiretamente, incluindo:
    • Arquivos de origem
    • Montagens referenciadas
    • Módulos referenciados
    • Recursos
    • O arquivo de chave de nome forte
    • @ arquivos de resposta
    • Analisadores
    • Conjuntos de regras
    • Outros arquivos que podem ser usados por analisadores
  • A cultura atual (para o idioma em que os diagnósticos e as mensagens de exceção são produzidos).
  • A codificação padrão (ou a página de código atual) se a codificação não for especificada.
  • A existência, inexistência e conteúdo de arquivos nos caminhos de pesquisa do compilador (especificado, por exemplo, por -lib ou -recurse).
  • A plataforma CLR (Common Language Runtime) na qual o compilador é executado.
  • O valor de , que pode afetar o carregamento de dependência do %LIBPATH%analisador.

A compilação determinística pode ser usada para estabelecer se um binário é compilado a partir de uma fonte confiável. A saída determinística pode ser útil quando a fonte está disponível publicamente. Ele também pode determinar se as etapas de compilação que dependem de alterações no binário usadas no processo de compilação.

ProduceOnlyReferenceAssembly

A opção ProduceOnlyReferenceAssembly indica que um assembly de referência deve ser saída em vez de um assembly de implementação, como a saída primária. O parâmetro ProduceOnlyReferenceAssembly desabilita silenciosamente PDBs de saída, pois assemblies de referência não podem ser executados.

<ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>

Os conjuntos de referência são um tipo especial de conjunto. Os assemblies de referência contêm apenas a quantidade mínima de metadados necessária para representar a superfície pública da API da biblioteca. Eles incluem declarações para todos os membros que são significativas ao fazer referência a um assembly em ferramentas de compilação, mas excluem todas as implementações de membros e declarações de membros privados que não têm impacto observável em seu contrato de API. Para obter mais informações, consulte Assemblies de referência.

As opções ProduceOnlyReferenceAssembly e ProduceReferenceAssembly são mutuamente exclusivas.