2012-02-05 69 views
2

目前我创造我自己的智能感知信息,并稍微不确定的点:拔出从DLL文件/头文件

的VS智能感知可以考虑引用的DLL,并从中拔出命名空间,类等等。它是否用反射来做到这一点?如果我添加一个用java编写的DLL(如果可以完成的话)会怎么样?如何添加一个用java编写的DLL(如果可以这样做的话?)

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

我不完全不在乎在Visual Studio中的具体实现智能感知的,但我感兴趣的是如何获得它的数据。

+2

.Net和Java和C++对彼此都无能为力。你有什么特别的问题? – SLaks 2012-02-05 23:16:08

+1

我相当确定你将不得不扫描标题。从二进制C++获取数据会变得困难(大多数东西在编译时会消失)。 – Lalaland 2012-02-05 23:22:11

+0

VC++ IDE只是解析头文件,它不会查看任何二进制文件。虽然VC#的确如此,但仅仅是因为.NET程序集几乎完全不同于普通的可执行程序。 – 2012-02-05 23:25:16

回答

1

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

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

对于C和C++,事情是不同的。单独的DLL中几乎没有可用的信息。有导出符号,但它们通常不表示符号是函数还是只是一个extrn,函数需要多少个参数以及哪些类型。 C++使用所谓的“损坏”名称,从中可以获得一些信息。但是关于库的大多数信息都来自头文件。据我所知,VS分析代码中包含的项目和.h文件的sopurce文件以获得智能感知数据库。有宏(#define's),以及内联和模板类和函数,它们完全不在DLL外部符号中。

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

不幸的是,我不知道很多关于Java给予了详细的回答你的问题的一部分。此外,还有一个流行的IDE框架称为Eclipse,但我没有仔细研究过它。必须有一些有趣的部分隐藏在那里,但做你自己的研究。

一些有用的参考资料:

  1. Visual Studio SDK。即使你不扩展视觉工作室,你也可能想阅读它的文档。它有一个关于智能感知的部分。另外,请看开源IDE,如Eclipse和#develop

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

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

+0

感谢您的答复,这正是我正在寻找。对不起,原来的帖子中有任何混淆 – LynchDev 2012-02-06 01:41:59