从DLL/头文件中提取信息

本文关键字:提取 信息 文件 DLL | 更新日期: 2023-09-27 18:22:44

我目前正在创建自己的intellisense,在一点上有点不确定:

VS Intellisense可以查看引用的DLL,并从中提取命名空间、类等。它是否使用反射来实现这一点?如果我添加一个用java制作的DLL(如果可以的话?)

对于C++,intellisense是否会扫描您#包含的简单头文件,并从中查找可用的命名空间、类等?

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

从DLL/头文件中提取信息

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

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

对于C和C++,情况是不同的。仅DLL中几乎没有可用的信息。有导出符号,但它们通常不表示符号是一个函数还是一个extrn,以及函数的参数数量和类型。C++使用所谓的"混乱"名称,从中可以获得一些信息。但是,关于库的大多数可用信息都来自头文件。据我所知,VS解析项目的源文件和代码中包含的.h文件,以获得intellisense数据库。有一些宏(#define)、内联类和模板类以及函数根本没有反映在DLL外部符号中。

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

不幸的是,我对Java了解不多,无法详细回答您的问题。此外,还有一个流行的IDE框架叫Eclipse,但我还没有深入了解它。一定有一些有趣的部分隐藏在那里,但要做你自己的研究。

一些有用的参考:

  1. Visual Studio SDK。即使您没有扩展visualstudio,您也可能需要阅读它的文档。它有一节关于Intellisense。另外,看看开源IDE,比如Eclipse和#development

  2. System.Diagnostics.SymbolStore命名空间包含用于访问PDB文件的类。在非托管世界中,使用DbgHelp库,它是Windows SDK的一部分。

  3. 一个名为Depends的实用程序是Win32 SDK的一部分,现在可以单独提供。它显示由非托管DLL定义的外部。本SO讨论揭示了以编程方式访问这些信息的几种方法。DbgHelp包含从PE导出目录中提取C++名称后,可以对其进行解压缩的函数。