C# Opções de compilador que especificam entradas

As seguintes opções controlam as entradas do compilador. A nova sintaxe MSBuild é mostrada em Negrito. A sintaxe csc.exe mais antiga é mostrada em code style.

  • Referências / -reference ou -references: Metadados de referência a partir do ficheiro ou ficheiros de montagem especificados.
  • AddModules / -addmodule: Adicione um módulo (criado com target:module este conjunto.)
  • Incorporação De InteropTypes / -link: Incorporar metadados nos ficheiros de montagem de interop especificados.

Referências

A opção Referências faz com que o compilador importe informações de tipo público no ficheiro especificado para o projeto atual, permitindo-lhe fazer referência aos metadados a partir dos ficheiros de montagem especificados.

<Reference Include="filename" />

filename é o nome de um ficheiro que contém um manifesto de montagem. Para importar mais de um ficheiro, inclua um elemento de referência separado para cada ficheiro. Pode definir um pseudónimo como elemento infantil do elemento referência :

<Reference Include="filename.dll">
  <Aliases>LS</Aliases>
</Reference>

No exemplo anterior, LS encontra-se o identificador C# válido que representa um espaço de nome de raiz que conterá todos os espaços de nome na montagem filename.dll. Os ficheiros que importa devem conter um manifesto. Utilize AdicionalLibPaths para especificar o diretório no qual uma ou mais referências de montagem estão localizadas. O tópico AdicionalLibPaths também discute os diretórios em que o compilador procura por assembleias. Para que o compilador reconheça um tipo num conjunto, e não num módulo, tem de ser forçado a resolver o tipo, o que pode fazer definindo uma instância do tipo. Existem outras formas de resolver os nomes de tipo num conjunto para o compilador: por exemplo, se herdar de um tipo num conjunto, o nome do tipo será reconhecido pelo compilador. Por vezes é necessário fazer referência a duas versões diferentes do mesmo componente a partir de um conjunto. Para tal, utilize o elemento Aliases no elemento Referências para cada ficheiro para distinguir entre os dois ficheiros. Este pseudónimo será usado como um qualificador para o nome do componente, e irá resolver-se para o componente em um dos ficheiros.

Nota

Em Visual Studio, utilize o comando Add Reference. Para obter mais informações, consulte Como: Adicionar ou remover referências utilizando o Gestor de Referência.

AddModules

Esta opção adiciona um módulo que foi criado com o <TargetType>module</TargetType> interruptor para a compilação atual:

<AddModule Include=file1 />
<AddModule Include=file2 />

Onde file, file2 são ficheiros de saída que contêm metadados. O ficheiro não pode conter um manifesto de montagem. Para importar mais de um ficheiro, separe os nomes dos ficheiros com uma vírgula ou um ponto e vírgula. Todos os módulos adicionados com AddModules devem estar no mesmo diretório que o ficheiro de saída no tempo de execução. Ou seja, pode especificar um módulo em qualquer diretório no momento da compilação, mas o módulo deve estar no diretório de aplicações no tempo de execução. Se o módulo não estiver no diretório de aplicações na hora de execução, você receberá um TypeLoadException. file não pode conter uma montagem. Por exemplo, se o ficheiro de saída foi criado com a opção TargetType do módulo, os seus metadados podem ser importados com AddModules.

Se o ficheiro de saída foi criado com uma opção TargetType diferente do módulo, os seus metadados não podem ser importados com AddModules , mas podem ser importados com a opção Referências .

Incorporam Mostipos De Entradas

Faz com que o compilador disponibilize informação do tipo COM nos conjuntos especificados para o projeto que está atualmente a compilar.

<References>
  <EmbedInteropTypes>file1;file2;file3</EmbedInteropTypes>
</References>

Onde file1;file2;file3 está uma lista de nomes de ficheiros de montagem de pontos de montagem. Se o nome do ficheiro contiver um espaço, encha o nome em aspas. A opção EmbedInteropTypes permite-lhe implementar uma aplicação que tenha incorporado informações de tipo. A aplicação pode então utilizar tipos num conjunto de tempo de execução que implementem as informações do tipo incorporados sem exigir uma referência ao conjunto de tempo de execução. Se forem publicadas várias versões do conjunto de tempo de execução, a aplicação que contém a informação do tipo incorporado pode funcionar com as várias versões sem ter de ser recompilada. Por exemplo, consulte Walkthrough: Tipos de incorporação de conjuntos geridos.

A utilização da opção EmbedInteropTypes é especialmente útil quando está a trabalhar com o interop COM. Pode incorporar tipos de COM de modo a que a sua aplicação não exija mais uma montagem de interop primária (PIA) no computador-alvo. A opção EmbedInteropTypes instrui o compilador a incorporar as informações do tipo COM a partir do conjunto de interops referenciado no código compilado resultante. O tipo COM é identificado pelo valor CLSID (GUID). Como resultado, a sua aplicação pode ser executada num computador-alvo que instalou os mesmos tipos de COM com os mesmos valores CLSID. As aplicações que automatizam Microsoft Office são um bom exemplo. Como aplicações como Office geralmente mantêm o mesmo valor CLSID em diferentes versões, a sua aplicação pode usar os tipos de COM referenciados desde que .NET Framework 4 ou posteriormente seja instalado no computador-alvo e a sua aplicação utiliza métodos, propriedades ou eventos incluídos nos tipos de COM referenciados. A opção EmbedInteropTypes incorpora apenas interfaces, estruturas e delegados. As aulas de coma não são suportadas.

Nota

Quando cria uma instância de um tipo COM incorporado no seu código, deve criar o caso utilizando a interface apropriada. Tentar criar uma instância de um tipo DE COM incorporado utilizando o CoClass causa um erro.

Tal como a opção de compilador References , a opção compilador EmbedInteropTypes utiliza o ficheiro de resposta Csc.rsp, que faz referências frequentemente utilizadas em conjuntos .NET. Utilize a opção de compilador NoConfig se não quiser que o compilador utilize o ficheiro Csc.rsp.

// The following code causes an error if ISampleInterface is an embedded interop type.
ISampleInterface<SampleType> sample;

Os tipos que têm um parâmetro genérico cujo tipo está incorporado a partir de um conjunto de interop não podem ser utilizados se esse tipo for de um conjunto externo. Esta restrição não se aplica às interfaces. Por exemplo, considere a Range interface que está definida na montagem Microsoft.Office.Interop.Excel . Se uma biblioteca incorporar tipos de interop do Microsoft.Office.Interop.Excel conjunto e expor um método que devolve um tipo genérico que tem um parâmetro cujo tipo é a Range interface, esse método deve devolver uma interface genérica, como mostra o seguinte exemplo de código.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Excel;

public class Utility
{
    // The following code causes an error when called by a client assembly.
    public List<Range> GetRange1()
    {
        return null;
    }

    // The following code is valid for calls from a client assembly.
    public IList<Range> GetRange2()
    {
        return null;
    }
}

No exemplo seguinte, o código do cliente pode ligar para o método que devolve a IList interface genérica sem erro.

public class Client
{
    public void Main()
    {
        Utility util = new Utility();

        // The following code causes an error.
        List<Range> rangeList1 = util.GetRange1();

        // The following code is valid.
        List<Range> rangeList2 = (List<Range>)util.GetRange2();
    }
}