3

C/C++ ヘッダー ファイルを操作する C# ライブラリを作成しようとしています。ヘッダー ファイルを読み取って解析し、C# で関数プロトタイプとデータ構造を操作できるようにしたいと考えています。#ifdefs やそのようなものによって引き起こされるすべてのコード ブランスのために、C パーサーを書くことを避けようとしています。

EnvDTE をいじってみましたが、適切なドキュメントが見つかりませんでした。どうすればそれを行うことができますか?

編集 - 回答ありがとうございます...私のプロジェクトの詳細は次のとおりです。デバッグAPIを使用してWindows用のptraceのようなツールを作成しています。これにより、既にコンパイルされたバイナリをトレースし、どのWindows APIが使用されているかを確認できます呼ばれています。また、各呼び出しでどのパラメーターが与えられ、どの戻り値が与えられるかを確認したいので、API の定義を知る必要があります。また、自分のライブラリの定義も知りたいです (したがって、ヘッダー解析アプローチ)。私は 3 つの解決策を考えました: * ヘッダー ファイルの解析 * PDB ファイルの解析 (DIA SDK を使用してプロトタイプを作成しましたが、残念ながら、シンボル PDB には API に関する一般的な情報のみが含まれており、パラメーターと戻り値を含む実際のプロトタイプは含まれていません) * MSDN オンライン ライブラリのクロール (自動または手動)

c# で実行時に Windows API とライブラリの名前と型を取得するためのより良い方法はありますか?

4

2 に答える 2

4

C(「ちょうど」ヘッダーでさえ)の解析は難しいです。言語は人々が覚えているよりも複雑であり、次にプリプロセッサがあり、最後に解析で何かを行うという問題があります。C ++には基本的にすべてのCが含まれていますが、ここでのC ++ 11では、問題はさらに悪化します。

多くの場合、Perlの正規表現やその他の文字列ハッカリーを使用して、限られた入力セットに対して98%のソリューションをハッキングできます。それがあなたのために働くなら、それなら大丈夫です。通常、2%の場合、ハッキングされたパーサーがチョークしたり、間違った答えを生成したりします。その後、結果をデバッグして、98%のソリューション出力を手動でハッキングします。

ハッキングされたソリューションは、実際のヘッダーファイルでかなりひどく失敗する傾向があります。これは、マクロと条件に奇妙さを集中させているようです(条件アームにCとC ++の異なる方言を混在させる場合もあります)。例として、典型的なMicrosoft.hファイルを参照してください。これは、OPが処理したいもののようです。前処理によって問題の一部が取り除かれ、CやC++の実際の複雑さに遭遇するようになります。前処理を行っても、実際のヘッダーファイルの98%のソリューションは得られません。typedefが必要なので、名前と型の解決も必要です。あなたはFOOXを「解析」するかもしれません。これは、XがFOOタイプであることを示しています...おっと、それは何ですか?シンボルテーブルだけが確実に知っています。

GCCXMLは、このすべての前処理、解析、およびシンボルテーブルの構築を行います... CのGCC方言の場合。Microsoftの方言は異なり、GCCXMLでは処理できないと思います。

より一般的なツールは、Cフロントエンドを備えたDMS SoftwareReengineeringToolkitです。C ++フロントエンドもあります(そうです、それらは異なります。CとC ++は長い目で見れば同じ言語ではありません)。これらは、さまざまなC方言(適切に構成されている場合はMSとGCCの両方)を処理し、マクロ/条件付き拡張を実行し、ASTとシンボルテーブルを構築します(その名前とタイプの解決は正しく行われます)。

生成されたシンボルテーブル構造をクロールすることにより、カスタマイズを追加して必要な情報を抽出できます。DMSは.net言語で実装されていないため、必要なものをC#にエクスポートする必要があります(たとえば、C#クラスを生成する)。

于 2012-05-11T15:38:37.700 に答える
0

最も一般的なケースでは、ヘッダー ファイルは使用可能であり、変換可能ではありません。

これは、マクロのプリプロセッサ (#define) の使用、構造定数のフラグメントなどの可能性によるもので、コンテキストで使用された場合にのみ意味を持ちます。

  • マクロで ## を含むものすべて

また

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

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

しかし、単純にすべてのマクロを破棄することはできません。そうすると、非常に一般的な呼び出し規則マクロを処理できなくなるからです。

などなど

そのため、ヘッダーの解析と変換は、ほとんどの場合、半自動化された使用 (クリーンアップされたヘッダーを手動で実行) または合理的にクリーンで一貫性のあるヘッダー (古い MS SDK ヘッダーなど) に対してのみ可能です。

一般的なケースは非常に難しいため、すぐに利用できるものはあまりありません。誰もが独自のヘッダー用に手早く汚いものを作成します。

私が知っている唯一のより一般的なツールは SWIG です。

于 2012-05-11T15:06:28.843 に答える