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 full
pdbonly
. 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.