#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();
}

另请参阅

预处理器指令