你应该:#import 还是 "add new reference"?

Should you: #import or "add new reference"?

过去我会使用 #import 来访问动态链接库公开的函数(即 *.DLL)。现在 Visual Studio 似乎有一个新的 添加新引用 选项。

项目 => 属性 页面 => 公共属性 => 参考文献

我的问题是:我应该使用哪种方法?

参考文献

以下方法用于公开我们库中的函数:

更新 1

我注意到的一件事是:与 C# 不同,您可以在 C# 中添加对 (1) GAC 中的程序集、(2) 文件系统中的程序集、(3) 解决方案中的项目的引用。在 C++ 中,您似乎只能向当前解决方案中的项目添加引用

嗯,我也遇到过同样的困境。我个人更喜欢进口。我觉得这样可以更好地形象化您的方法。但主要原因是这样你可以只导出一个头文件。不会因为缺少 lib 文件而中断。

但我认为这完全是个人喜好问题。

具体规则:

  • #import 应该只用于 COM 类型库。 .tlb 文件或 .dll/.ocx(如果类型库嵌入到可执行文件中)非常常见。编译器将类型库转换为 .tli 和 .tlh 文件,其中包含编译器可以理解的格式的声明以及智能指针类型和包装函数,这使得处理内存管理和运行时错误变得更加容易。在 C# 中,您可以使用添加引用或 Tlbimp.exe 来做同样的事情。

  • Add New Reference 适用于 C++/CLI 项目中的 .NET 程序集。编译器导入存储在程序集元数据中的类型声明,粗略相当于一个#including 本机 DLL 的 .h 文件。与 C# 项目中的添加引用完全相同。

  • #include 用于包含一个带有声明的 .h 文件,这是告诉 C++ 编译器有关其他地方的代码的正常方式。

  • 从 VS2012 开始,Add New Reference 现在也可用于为作为解决方案一部分的静态库或 DLL 项目生成 link 指令。 linker 只是简单地获取 link 项目的 .lib 文件的指令。在 C# 中没有等效项,它不使用 linker.

  • Project + Properties > Linker > Input > Additional Dependenciesother 方法来做与上一个项目符号相同的事情。如果 .lib 文件不是由解决方案中的项目生成的,则必须使用

注意两组项目符号的区别。前 3 个影响编译器并用于告诉它有关类型声明的信息。后两个影响 linker 并用于告诉它存储在别处的 link 代码。