Diretiva #using (C++/CLI)

Importa metadados para um programa compilado com /clr.

Sintaxe

#usingarquivo [as_friend]

Parâmetros

file
Um arquivo MSIL (linguagem intermediária da Microsoft) .dll, .exe, .netmodule ou .obj. Por exemplo,

#using <MyComponent.dll>

as_friend
Especifica que todos os tipos em arquivo são acessíveis. Para obter mais informações, consulte Assemblies amigáveis (C++).

Comentários

O arquivo pode ser um arquivo MSIL (linguagem intermediária da Microsoft) que você importará para seus dados gerenciados e constructos gerenciados. Se uma DLL contiver um manifesto de assembly, todas as DLLs referenciadas no manifesto serão importadas. O assembly que você está criando listará o arquivo nos metadados como uma referência de assembly.

Talvez o arquivo não contenha um assembly (o arquivo é um módulo) e você não pretende usar informações de tipo do módulo no aplicativo atual (assembly). Você pode indicar que o módulo faz parte do assembly usando /ASSEMBLYMODULE. Então, os tipos no módulo estariam disponíveis para qualquer aplicativo que fizesse referência ao assembly.

Uma alternativa ao uso de #using é a opção do compilador /FU.

Os assemblies de .exe transmitidos para #using devem ser compilados usando um dos compiladores do .NET Visual Studio (Visual Basic ou Visual C#, por exemplo). Tentar importar metadados de um assembly .exe compilado com /clr resultará em uma exceção de carregamento de arquivo.

Observação

Um componente que é referenciado com #using pode ser executado com outra versão do arquivo importado em tempo de compilação, fazendo com que um aplicativo cliente gere resultados inesperados.

Para o compilador reconhecer um tipo em um assembly (não um módulo), ele precisa ser forçado a resolver o tipo. Você pode forçá-lo, por exemplo, definindo uma instância do tipo. Há outras maneiras de resolver nomes de tipo em um assembly para o compilador. Por exemplo, se você herdar de um tipo em um assembly, o nome do tipo se tornará conhecido pelo compilador.

Ao importar metadados criados a partir do código-fonte que usou __declspec(thread), a semântica de thread não persiste nos metadados. Por exemplo, uma variável declarada com __declspec(thread), compilada em um programa criado para o .NET Framework Common Language Runtime e, em seguida, importado via #using não terá mais a semântica de __declspec(thread) na variável.

Todos os tipos importados (gerenciados e nativos) em um arquivo referenciado por #using estão disponíveis, mas o compilador tratará os tipos nativos como declarações, não como definições.

mscorlib.dll é referenciado automaticamente durante a compilação com /clr.

A variável de ambiente LIBPATH especifica os diretórios a serem pesquisados quando o compilador tentar resolver os nomes de arquivo transmitidos para #using.

O compilador pesquisa referências ao longo do seguinte caminho:

  • Um caminho especificado na instrução #using.

  • O diretório atual.

  • O diretório do sistema do .NET Framework.

  • Diretórios adicionados com a opção do compilador /AI.

  • Diretórios na variável de ambiente LIBPATH.

Exemplos

Você pode criar um assembly que referencie um segundo assembly que, por sua vez, faça referência a um terceiro assembly. Você só precisará referenciar explicitamente o terceiro assembly do primeiro se você usar explicitamente um de seus tipos.

Arquivo de origem using_assembly_A.cpp:

// using_assembly_A.cpp
// compile with: /clr /LD
public ref class A {};

Arquivo de origem using_assembly_B.cpp:

// using_assembly_B.cpp
// compile with: /clr /LD
#using "using_assembly_A.dll"
public ref class B {
public:
   void Test(A a) {}
   void Test() {}
};

Na amostra a seguir, o compilador não relata um erro por fazer referência using_assembly_A.dll, pois o programa não usa nenhum dos tipos definidos em using_assembly_A.cpp.

// using_assembly_C.cpp
// compile with: /clr
#using "using_assembly_B.dll"
int main() {
   B b;
   b.Test();
}

Confira também

Diretivas de pré-processador