direttiva #using (C++/CLI)
Importa i metadati in un programma compilato con /clr.
Sintassi
#using
file [as_friend
]
Parametri
file
Un file MSIL (Microsoft Intermediate Language), .dll
.exe
, .netmodule
, o .obj
. ad esempio:
#using <MyComponent.dll>
as_friend
Specifica che tutti i tipi nel file sono accessibili. Per altre informazioni, vedere Assembly Friend (C++).
Osservazioni:
il file può essere un file MSIL (Microsoft Intermediate Language) importato per i relativi costrutti gestiti e dati gestiti. Se una DLL contiene un manifesto dell'assembly, vengono importate tutte le DLL a cui si fa riferimento nel manifesto. L'assembly che si sta creando elenca il file nei metadati come riferimento all'assembly.
Ad esempio , il file non contiene un assembly (file è un modulo) e non si intende usare le informazioni sul tipo del modulo nell'applicazione corrente (assembly). È possibile indicare che il modulo fa parte dell'assembly usando /ASSEMBLYMODULE. I tipi nel modulo sono quindi disponibili per qualsiasi applicazione con riferimento nell'assembly.
Un'alternativa all'uso #using
è l'opzione del compilatore /FU .
.exe assembly passati a #using
devono essere compilati usando uno dei compilatori di Visual Studio .NET (ad esempio Visual Basic o Visual C#). Se si prova a importare i metadati di un assembly con estensione exe compilato con /clr
, verrò generata un'eccezione di caricamento del file.
Nota
Un componente a #using
cui viene fatto riferimento può essere eseguito con una versione diversa del file importato in fase di compilazione, causando la generazione di risultati imprevisti da parte di un'applicazione client.
Affinché il compilatore riconosca un tipo in un assembly (non un modulo), deve essere forzato a risolvere il tipo. È possibile forzarlo, ad esempio, definendo un'istanza del tipo. Esistono altri modi per risolvere i nomi dei tipi in un assembly per il compilatore. Ad esempio, se si eredita da un tipo in un assembly, il nome del tipo diventa noto al compilatore.
Quando si importano metadati compilati dal codice sorgente che usava __declspec(thread)
, la semantica del thread non viene mantenuta nei metadati. Ad esempio, una variabile dichiarata con __declspec(thread)
, compilata in un programma compilato per Common Language Runtime di .NET Framework e quindi importata tramite #using
, non avrà __declspec(thread)
semantica sulla variabile.
Tutti i tipi importati (gestiti e nativi) in un file a cui viene fatto #using
riferimento sono disponibili, ma il compilatore considera i tipi nativi come dichiarazioni, non le definizioni.
Il file mscorlib.dll viene automaticamente referenziato se si esegue la compilazione con /clr
.
La variabile di ambiente LIBPATH specifica le directory da cercare quando il compilatore risolve i nomi di file passati a #using
.
Il compilatore cerca i riferimenti nel percorso seguente:
Percorso specificato nell'istruzione
#using
.Directory corrente.
Directory di sistema di .NET Framework.
Directory aggiunte con l'opzione del
/AI
compilatore.Directory nella variabile di ambiente LIBPATH.
Esempi
È possibile compilare un assembly che fa riferimento a un secondo assembly che fa riferimento a un terzo assembly. È necessario fare riferimento in modo esplicito al terzo assembly dal primo solo se si usa in modo esplicito uno dei relativi tipi.
using_assembly_A.cpp
File di origine :
// using_assembly_A.cpp
// compile with: /clr /LD
public ref class A {};
using_assembly_B.cpp
File di origine :
// using_assembly_B.cpp
// compile with: /clr /LD
#using "using_assembly_A.dll"
public ref class B {
public:
void Test(A a) {}
void Test() {}
};
Nell'esempio seguente il compilatore non segnala un errore relativo al riferimento using_assembly_A.dll, perché il programma non usa alcun tipo definito in using_assembly_A.cpp.
// using_assembly_C.cpp
// compile with: /clr
#using "using_assembly_B.dll"
int main() {
B b;
b.Test();
}