从DLL /头文件中提取信息

时间:2012-02-05 23:14:02

标签: c# c++ visual-studio intellisense header-files

我目前正在创建自己的智能感知,并且稍微不确定某一点:

VS Intellisense可以查看引用的DLL并从中提取名称空间,类等。它是用反射做的吗?如果我添加一个用java制作的DLL(如果能做到的话)怎么办?

对于C ++,intellisense简单扫描头文件#include,并从中找到可用的命名空间,类等?

我并不完全关心visual studio中intellisense的确切实现,但我对如何获取它的数据感兴趣。

1 个答案:

答案 0 :(得分:1)

编译的.NET程序集和Java类包含有关它们定义的类和符号的所有元信息。不需要.h或.lib文件来链接它们。对于这些类型的模块,可以直接从中提取大量信息。

我不知道Visual Studio 是否使用反射从托管程序集中读取元数据,但反射肯定是在这种情况下应用的正确机制。但是请注意,VS显示的信息比直接包含在程序集中的信息多,即/// doc-comments。这些可能来自解决方案中其他项目的源文件,也可能来自程序集附带的单独.XML文件。

对于C和C ++,问题不同。仅DLL中几乎没有可用的信息。有导出符号,但它们通常不表示符号是函数还是只是extrn,以及函数需要多少个参数和类型。 C ++使用所谓的“受损”名称,从中可以获得一些信息。但是大多数关于库的信息来自头文件。据我所知,VS解析了代码中包含的项目和.h文件的高级文件,以获取智能感知数据库。有宏(#define),内联和模板类以及函数根本没有反映在DLL外部符号中。

对于托管和非托管程序集,有时可以使用调试信息PDB文件。同样,我不确定,但我认为VS并没有将它们用于intellisense。这并不意味着你不应该这样做。它包含有关外部变量,类,函数和方法的扩展信息。总而言之,没有“标准”智能感知方法,您可能应该考虑使用多个来源来获取符号源信息。

不幸的是,我不太了解Java,无法详细解答您问题的这一部分。此外,还有一个名为Eclipse的流行IDE框架,但我还没有深入了解。必须隐藏一些有趣的部分,但要做自己的研究。

一些有用的参考资料:

  1. Visual Studio SDK。即使您没有扩展visual studio,也可以阅读其文档。它有一个关于Intellisense的部分。另外,请查看开源IDE,例如Eclipse和#develop

  2. System.Diagnostics.SymbolStore Namespace包含访问PDB文件的类。在非托管环境中,使用DbgHelp library,Windows SDK的一部分。

  3. 名为Depends的实用程序是Win32 SDK的一部分,现在可单独使用。它显示由非托管DLL定义的外部。 This SO discussion显示了一些以编程方式访问此信息的方法。 DbgHelp包含从PE导出目录中提取C ++名称后解除C ++名称的函数。