#using 指令 (C++/CLI)
将元数据导入使用 /clr 编译的程序。
语法
#using
文件 [as_friend
]
参数
file
Microsoft 中间语言 (MSIL) .dll
、.exe
、.netmodule
或 .obj
文件。 例如,
#using <MyComponent.dll>
as_friend
指定 file 中的所有类型都是可访问的。 有关详细信息,请参阅友元程序集 (C++)。
备注
文件可以是你为其托管数据和托管构造导入的 Microsoft 中间语言 (MSIL) 文件。 如果 DLL 包含程序集清单,则会导入清单中引用的所有 DLL。 你正在构建的程序集将在元数据中作为程序集参考列出文件。
或许文件不包含程序集(文件是一个模块),并且你不打算在当前(程序集)应用程序中使用来自模块的类型信息。 你可以使用 /ASSEMBLYMODULE 来表明模块是程序集的一部分。 然后,模块中的类型将可用于引用此程序集的任何应用程序。
/FU 编译器选项是使用 #using
的替代方式。
传递给 #using
的 .exe 程序集应使用 .NET Visual Studio 编译器之一(例如,Visual Basic 或 Visual C#)进行编译。 尝试从使用 /clr
编译的 .exe 程序集导入元数据将导致文件加载异常。
注意
使用 #using
引用的组件可与编译时导入的文件的其他版本一起运行,这会导致客户端应用程序产生意外结果。
为了使编译器能够识别程序集(而非模块)中的类型,需要强制其解析该类型。 例如,可以通过定义该类型的实例来强制执行以上操作。 还可以使用其他方法来为编译器解析程序集中的类型名称。 例如,如果从程序集中的类型继承,则编译器将知道类型名称。
在导入从使用 __declspec(thread)
的源代码生成的元数据时,线程语义不会保留在元数据中。 例如,使用 __declspec(thread)
声明的变量(在为 .NET Framework 公共语言运行时生成的程序中编译,然后通过 #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();
}