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