#using — dyrektywa (C++)
Importuje metadane do programu skompilowanego z /clr.
#using file [as_friend]
Parametry
file
Plik .dll, .exe, .netmodule lub .obj.Na przykład:#using <MyComponent.dll>
as_friend
Określa, że wszystkie typy w file są dostępne. Aby uzyskać więcej informacji, zobacz Przyjazne zestawy (C++).
Uwagi
file może być plikiem Microsoft intermediate language (MSIL), zaimportowanym ze względu na jego zarządzane dane lub konstrukcje.Jeśli plik .dll zawiera manifest zestawu to wszystkie pliki .dll, do których odwołuje się manifest są importowane, a kompilowany zestaw będzie zawierał plik file na liście w metadanych jako odwołanie zestawu.
Jeśli file nie zawiera zestawu (gdy file jest modułem) i jeśli nie zamierzasz używać informacji o typie z modułu w bieżącej aplikacji (zestawie), masz możliwość wskazania, czy moduł jest częścią zestawu; użyj /ASSEMBLYMODULE.Typy w module będą wtedy dostępne dla innych aplikacji, które posiadają odwołanie do zestawu.
Alternatywnie, zamiast używać #using można skorzystać z opcji /FU kompilatora.
Zestawy .exe przekazane do #using , powinny zostać skompilowane z /clr:safe lub /clr:pure lub z dowolnym innym kompilatorem programu Visual Studio (na przykład Visual Basic lub Visual C#). Próba zaimportowania metadanych z zestawu .exe skompilowanego z /clr spowoduje powstanie wyjątku ładowania plików.
[!UWAGA]
Składnik, do którego istnieje odwołanie za pomocą #using może być uruchomiony za pomocą innej wersji pliku zaimportowanego w czasie kompilacji, przez co aplikacja klienta może zwrócić nieoczekiwane wyniki.
Aby kompilator rozpoznał typ w zestawie (a nie module), należy wymusić w nim rozpoznanie typu, co można zrobić, na przykład, poprzez zdefiniowanie wystąpienia typu.Istnieją inne sposoby rozpoznawania nazw typu w zestawie dla kompilatora, na przykład, jeśli dziedziczy się z typu w zestawie, nazwa typu będzie wtedy znana dla kompilatora.
Podczas importowania metadanych zbudowanych z kodu źródłowego przy użyciu __declspec(thread), semantyka wątku nie są zachowywana w metadanych.Na przykład, zmienna zadeklarowana z __declspec(thread), skompilowana w programie zbudowanym dla środowiska uruchomieniowego języka wspólnego .NET Framework, a następnie zaimportowana za pomocą #using, nie będzie już posiadała semantyki __declspec(thread) w zmiennej.
Wszystkie zaimportowane typy (i zarządzane, i natywne) w pliku, do którego odwołuje się #using są dostępne, ale kompilator traktuje natywne typy jako deklaracje, a nie definicje.
Podczas kompilowania z /clr tworzy się automatyczne odwołanie do mscorlib.dll.
Zmienna środowiskowa LIBPATH określa katalogi, które będą przeszukiwane, gdy kompilator będzie próbował rozpoznać nazwy plików przekazane do #using.
Kompilator będzie szukał odwołań w następującej ścieżce:
Ścieżka określona w instrukcji #using.
Bieżący katalog.
Katalog systemowy .NET Framework.
Katalogi dodane z opcją /AI kompilatora.
Katalogi w zmiennej środowiskowej LIBPATH.
Przykład
Jeśli kompilujesz zestaw (C) i odwołujesz się do zestawu (B), który sam odwołuje się do innego zestawu (A), nie musisz jawnie odwoływać się do zestawu A, chyba że jawnie używasz jednego z typów z A w C.
// using_assembly_A.cpp
// compile with: /clr /LD
public ref class A {};
// using_assembly_B.cpp
// compile with: /clr /LD
#using "using_assembly_A.dll"
public ref class B {
public:
void Test(A a) {}
void Test() {}
};
W następującym przykładzie nie ma błędu kompilatora za brak odwołania "using_assembly_A.dll", ponieważ program nie używa żadnego z typów zdefiniowanych w "using_assembly_A.cpp".
// using_assembly_C.cpp
// compile with: /clr
#using "using_assembly_B.dll"
int main() {
B b;
b.Test();
}