簡體   English   中英

在運行時將.h頭文件解析為c#數據結構

[英]Parse .h header files into c# data structures in runtime

我正在嘗試編寫一個C#庫來操作我的C / C ++頭文件。我希望能夠讀取和解析頭文件並在C#中操作函數原型和數據結構。 我試圖避免編寫C解析器,因為#ifdefs引起的所有代碼都是這樣的。

我試過玩EnvDTE,但找不到任何體面的文檔。 任何想法我該怎么辦?

編輯 - 謝謝你的答案......這里有一些關於我的項目的更多細節:我正在使用調試API編寫類似ptrace的Windows工具,這使我能夠跟蹤已編譯的二進制文件並查看哪些是Windows API被召喚。 我還想看看每個調用中給出了哪個參數以及給出了什么返回值,所以我需要知道API的定義。 我也想知道我自己的庫的定義(因此,頭解析方法)。 我想到了3個解決方案:*解析頭文件*解析PDB文件(我使用DIA SDK編寫了原型,但不幸的是,符號PDB只包含有關API的一般信息,而不包含帶參數和返回值的真實原型) *爬過MSDN在線圖書館(自動或手動)

有沒有更好的方法在c#中運行時獲取Windows API和我的庫的名稱和類型?

解析C(甚至“只是”標題)很難; 語言比人們記憶更復雜,然后是預處理器,最后是解析器的問題。 C ++基本上包含所有的C,而C ++ 11在這里的問題更嚴重。

對於有限的輸入,人們通常可以破解98%的解決方案,通常使用Perl中的正則表達式或其他一些字符串hackery。 如果這對你有用,那很好。 通常情況下,2%導致被黑客攻擊的解析器窒息或產生錯誤的答案,然后您可以調試結果並手動攻擊98%的解決方案輸出。

黑客解決方案往往在真正的頭文件上失敗,這似乎集中了宏和條件中的怪異(有時甚至在條件臂中混合不同的C和C ++方言)。 以典型的Microsoft .h文件為例。 這似乎是OP想要處理的內容。 預處理消除了部分問題,現在您將遇到C和/或C ++的真正復雜性。 即使使用預處理,您也無法獲得98%的真實頭文件解決方案; 你需要typedef,因此也需要名稱和類型解析。 你可以“解析”FOO X; 這告訴你X是FOO類型的...... oops,那是什么? 只有符號表才能確定。

GCCXML為C的GCC方言做了所有這些預處理,解析和符號表構造....微軟的方言是不同的,我不認為GCCXML可以處理它。

一個更通用的工具是我們的DMS軟件再造工具包 ,它的C前端 ; 還有一個C ++前端 (是的,它們是不同的; C和C ++遠遠不是同一種語言)。 這些處理各種各樣的C方言(正確配置時為MS和GCC),進行宏/條件擴展,構建AST和符號表(正確地命名和鍵入分辨率)。

您可以通過爬網生成的符號表結構來添加自定義以提取所需的信息。 你必須導出你想要的C#(例如生成你的C#類),因為DMS沒有用.net語言實現。

在最常見的情況下,頭文件僅可用,不可轉換。

這可能是因為預處理器(#define)使用宏,結構常量的片段等只能在上下文中使用時才有意義。

例子

  • 任何在宏中都帶有##的東西

要么

//header
#define mystructconstant "bla","bla"

// in using .c
char test[10][2] ={mystructconstant};

但是你不能簡單地丟棄所有的宏,因為那樣你就不會處理非常常見的調用約定宏了

等等

因此,標頭解析和轉換主要僅適用於半自動使用(通過它手動運行清理的標頭)或合理清潔和一致的標頭(例如舊的MS SDK標頭)

由於一般情況如此困難,因此沒有太多可用的。 每個人都為自己的標題制作快速而骯臟的東西。

我所知道的唯一更通用的工具是SWIG。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM