Diretiva #using (C++/CLI)
Importa metadados para um programa compilado com /clr.
Sintaxe
#using
arquivo [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() {}
};
No exemplo a seguir, o compilador não relata um erro sobre a referência using_assembly_A.dll, pois o programa não usa nenhum dos tipos definidos no using_assembly_A.cpp.
// using_assembly_C.cpp
// compile with: /clr
#using "using_assembly_B.dll"
int main() {
B b;
b.Test();
}