c# - 在运行时将.h 头文件解析为c# 数据结构

标签 c# c++ parsing compiler-construction compilation

我正在尝试编写一个 C# 库来操作我的 C/C++ 头文件。我希望能够读取和解析头文件并在 C# 中操作函数原型(prototype)和数据结构。由于 #ifdefs 和类似的东西引起的所有代码分支,我试图避免编写 C 解析器。

我试过使用 EnvDTE,但找不到任何合适的文档。 我该怎么做?有什么想法吗?

编辑 - 谢谢你的回答...这里有一些关于我的项目的更多细节:我正在使用调试 API 为 Windows 编写一个类似 ptrace 的工具,它使我能够跟踪我已经编译的二进制文件并查看正在调用哪些 Windows API .我还想查看每次调用中给出的参数以及给出的返回值,因此我需要知道 API 的定义。我还想知道我自己的库的定义(因此, header 解析方法)。我想到了3个解决方案: * 解析头文件 * 解析 PDB 文件(我使用 DIA SDK 编写了一个原型(prototype),但不幸的是,符号 PDB 仅包含有关 API 的一般信息,而不包含带有参数和返回值的真实原型(prototype)) * 爬取 MSDN 在线库(自动或手动)

有没有更好的方法在 C# 运行时获取 Windows API 和我的库的名称和类型?

最佳答案

解析 C(甚至“只是”标题)很困难;语言比人们内存中的更复杂, 然后是预处理器,最后是对解析进行处理的问题。 C++ 基本上包括所有 C,而对于 C++11,问题更严重。

人们通常可以针对一组有限的输入破解 98% 的解决方案,通常使用 Perl 中的正则表达式或其他一些字符串破解。如果这对你有用,那很好。通常发生的情况是 2% 导致被黑的解析器阻塞或产生错误的答案,然后您可以调试结果并手工破解 98% 的解决方案输出。

被黑客攻击的解决方案往往在真正的头文件上非常失败,这似乎集中在宏和条件中的怪异(有时甚至到了在条件臂中混合 C 和 C++ 的不同方言的程度)。以典型的 Microsoft .h 文件为例。这似乎是 OP 想要处理的。预处理解决了部分问题,现在您将遇到 C 和/或 C++ 的真正复杂性。即使经过预处理,您也不会获得真正头文件的 98% 解决方案;您需要 typedef,因此也需要名称和类型解析。您可能会“解析” FOO X;这告诉你 X 是 FOO 类型的……哎呀,那是什么?只有符号表才能确定。

GCCXML 为 C 的 GCC 方言完成了所有这些预处理、解析和符号表构建......微软的方言不同,我认为 GCCXML 无法处理它。

一个更通用的工具是我们的 DMS Software Reengineering Toolkit , 及其 C front end ;还有一个 C++ front end (是的,它们是不同的;从长远来看,C 和 C++ 不是同一种语言)。这些处理各种 C 方言(正确配置时包括 MS 和 GCC),进行宏/条件扩展,构建 AST 和符号表(名称和类型解析是否正确)。

您可以通过爬取生成的符号表结构来添加自定义以提取所需的信息。您必须将您想要的内容导出到 C#(例如,生成您的 C# 类),因为 DMS 不是以 .net 语言实现的。

关于c# - 在运行时将.h 头文件解析为c# 数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10548116/

相关文章:

c++ - CUDA:错误 LNK2005:DllMain 已在 MSVCRT.lib 中定义

C++ : Access of a child member from a parent class

android - 如何使用 GSON 解析此 JSON 数据?并将其放入 ArrayList

c# - 新的 MVC Area _layout 不继承....System.Web.WebPages.StartPage

c# - 在 C# 中将字符串转换为颜色

c# - 对象必须实现 IConvertible

c# - 根据屏幕宽 x 屏幕高查找显示器配置

c++ - Windows 10 中的 Windows 运行时可激活类

java - 使用 Jackson 解析器获取整个 JSON 对象

c++ - Qt 解析自定义文件格式