Partilhar via


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 code style

  • DebugType / -debug: Emita (ou não emite) informações de depuração.
  • Otimizar / -optimize: Habilitar otimizações.
  • Determinística / -deterministic: Produz uma saída idêntica byte por byte a partir 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.

Nota

Consulte Opções do compilador para obter mais informações sobre como configurar essas opções para seu projeto.

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:

Valor 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 Portátil PDB 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á ativo se tu não especificares pdbonly, permite ligar um depurador ao programa em execução. A especificação pdbonly permite a depuração do código-fonte quando o programa é iniciado no depurador, mas só exibirá o código de montagem quando o programa em execução estiver anexado ao depurador. Use esta opção para criar compilações de debug. 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 o uso de pdbonly ou a ausência de PDB para gerar código de release. 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, receberá um erro se o seu código contiver o DebuggableAttribute configurado para false quando 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á ativada por defeito para uma configuração de compilação em modo 'Release'. 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 runtime do Common Language 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 utilizado por uma assembly, use as mesmas configurações de Otimização usadas pela 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 em todas as 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 os 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
    • Link de origem dados extraídos do repositório (por exemplo, git commit SHA, URL do repositório, etc.)
    • 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 %LIBPATH%, que pode afetar o carregamento de dependências dos analisadores.

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, são utilizadas no processo de compilação.

ProduceOnlyReferenceAssembly

A opção ProduceOnlyReferenceAssembly indica que um assembly de referência deve ser produzido em vez de um assembly de implementação, como saída principal. O parâmetro ProduceOnlyReferenceAssembly desativa silenciosamente a produção de PDBs, já que 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.