#using 指令 (C++)
用 /clr将元数据导入程序编译。
#using file [as_friend]
参数
file
MSIL .dll、.exe、.netmodule 或 .obj。 例如,#using <MyComponent.dll>
as_friend
指定所有类型 file 都是可访问的。有关详细信息,请参阅友元程序集 (C++)。
备注
file 可以是您为其托管数据导入和管理构造的 microsoft 中间语言 (msil) 文件。 如果 .dll 文件包含一个程序集清单,则导入清单中引用的所有 .dll,并将生成的程序集和在元数据 file 为程序集引用。
如果 file 不包含程序集 (如果 file 是模块),并且,如果您在当前 (程序集) 应用程序不想使用从模块的类型信息,则具有清单的选项模块作为部分程序集;使用 /ASSEMBLYMODULE。 模块中的类型和被引用程序集的对所有应用程序都可用。
使用#using 的替代项为 /FU 编译器选项。
将生成的 .exe 程序传递给 #using 应当被 /clr:safe 或 /clr:pure编译,或者与其他任意的 Visual Studio 编译器 (如:Visual Basic 或 Visual C#)。试图从 .exe 程序集导入元数据编译 /clr 将会导致文件加载异常。
备注
使用引用 #using 的元素可以运行带有文件的不同版本导入在编译时,导致客户端应用程序产生意外的结果。
为了让编译器识别出程序集中的类型(而不是模块),需要强制解析类型,例如可以通过定义此类型的实例来完成。 也有其他方法来为编译器解析程序集中的类型名称,例如,如果从一个程序集的类型继承,编译器就会知道此类型名称。
当导入生成的元数据使用 __declspec(thread)中的源代码,线程语义在元数据不会保留。 例如,通过 #using声明 __declspec(thread),生成将作为 .NET Framework 公共语言运行时生成的程序,然后导入的变量,将不再具有在变量中 __declspec(thread) 语义。
所有导入的类型 (管理和本机) 在 #using 引用的文件可用,但是,编译器将本机类型作为不是声明定义。
在使用编译 /clr时,mscorlib.dll 自动引用。
LIBPATH 环境变量指定要搜索的目录,则编译器尝试解析文件名并传递给 #using。
编译器将沿下列路径搜索引用:
在 #using 语句中指定的路径。
当前目录。
.NET Framework 系统目录。
从目录添加与 /AI 编译器选项。
在 LIBPATH 环境变量的目录。
示例
如果您生成程序集 (c) 和引用自身引用其他程序集的程序集 (b),您不需要显式引用程序集 A,除非您显式使用一个来输入 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() {}
};
在下面的示例中,因为程序在 using_assembly_A.cpp,不使用定义的任何一个类型不引用的 using_assembly_A.dll 编译器错误。
// using_assembly_C.cpp
// compile with: /clr
#using "using_assembly_B.dll"
int main() {
B b;
b.Test();
}