Директива #using (C++/CLI)
Импорт метаданных в программу, скомпилированную с помощью /clr.
Синтаксис
#using
file [as_friend
]
Параметры
file
Промежуточный язык Майкрософт (MSIL) .dll
.exe
.netmodule
или .obj
файл. Например,
#using <MyComponent.dll>
as_friend
Указывает, что все типы в файле доступны. Дополнительные сведения см. в разделе "Дружественные сборки" (C++).
Замечания
файл может быть файлом промежуточного языка Майкрософт (MSIL), импортируемым для управляемых данных и управляемых конструкций. Если библиотека DLL содержит манифест сборки, импортируются все библиотеки DLL, на которые ссылается манифест. Сборка, которую вы создаете, будет перечислять файл в метаданных в качестве ссылки на сборку.
Возможно, файл не содержит сборку (файл является модулем), и вы не планируете использовать сведения о типе из модуля в текущем приложении (сборка). Вы можете указать, что модуль является частью сборки с помощью /ASSEMBLYMODULE. После этого типы из этого модуля будут доступны любому приложению, ссылки на которые содержатся в этой сборке.
Альтернативой использованию #using
является параметр компилятора /FU .
.exe сборки, передаваемые #using
для компиляции, следует скомпилировать с помощью одного из компиляторов Visual Studio .NET (Visual Basic или Visual C#, например). При попытке импортировать метаданные из сборки файла .exe, скомпилированной с параметром /clr
, возникнет исключение загрузки файла.
Примечание.
Компонент, на который ссылается ссылка, #using
может выполняться с другой версией файла, импортированного во время компиляции, что приводит к тому, что клиентское приложение дает непредвиденные результаты.
Чтобы компилятор распознал тип в сборке (а не модуль), его необходимо принудительно разрешить. Например, можно принудительно применить его, определив экземпляр типа. Существуют другие способы разрешения имен типов в сборке компилятора. Например, если вы наследуете тип в сборке, имя типа становится известно компилятору.
При импорте метаданных, созданных из исходного кода, который использовался __declspec(thread)
, семантика потока не сохраняется в метаданных. Например, переменная, объявленная с __declspec(thread)
помощью , скомпилированная в программе, созданной для платформа .NET Framework среды cl CLR, а затем импортированная с помощью#using
, не будет иметь __declspec(thread)
семантику для переменной.
Все импортированные типы (управляемые и собственные) в файле, на который ссылается #using
ссылка, доступны, но компилятор обрабатывает собственные типы как объявления, а не определения.
При компиляции с параметром /clr
ссылка на файл mscorlib.dll создается автоматически.
Переменная среды LIBPATH указывает каталоги для поиска при разрешении имена файлов, переданных компилятору #using
.
Компилятор выполняет поиск ссылок по следующему пути:
Путь, указанный в инструкции
#using
.Текущий каталог.
Системный каталог .NET Framework.
Каталоги, добавленные с параметром компилятора
/AI
.Каталоги, указанные в переменной среды LIBPATH.
Примеры
Вы можете создать сборку, которая ссылается на вторую сборку, которая ссылается на третью сборку. Необходимо явно ссылаться только на третью сборку из первой, если вы явно используете один из его типов.
Исходный файл using_assembly_A.cpp
:
// using_assembly_A.cpp
// compile with: /clr /LD
public ref class A {};
Исходный файл 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() {}
};
В следующем примере компилятор не сообщает об ошибке ссылки using_assembly_A.dll, так как программа не использует ни один из типов, определенных в using_assembly_A.cpp.
// using_assembly_C.cpp
// compile with: /clr
#using "using_assembly_B.dll"
int main() {
B b;
b.Test();
}