ocaml で記述されたアプリケーションで、マネージ DLL を読み取り、そこに含まれるクラス定義を取得する必要があります。それを行う方法に関する公開ドキュメント/サンプルコードはどこにありますか?
[編集: このアプリケーションは ocaml で作成しているため、.NET 独自のアセンブリ検査機能を使用できないため、実際のファイル形式の定義を探しています]
ありがとうございました!
ocaml で記述されたアプリケーションで、マネージ DLL を読み取り、そこに含まれるクラス定義を取得する必要があります。それを行う方法に関する公開ドキュメント/サンプルコードはどこにありますか?
[編集: このアプリケーションは ocaml で作成しているため、.NET 独自のアセンブリ検査機能を使用できないため、実際のファイル形式の定義を探しています]
ありがとうございました!
主に変更される可能性があり、何度か変更されているため(.NET 1.1、2.0、および 4.0)、正式なファイル仕様はありません。アセンブリ マニフェストのメタデータ テーブルの構造に関する説明は、Ecma 335で入手できます。Windows SDK の CorHdr.h ファイルには必須の宣言が含まれていますが、C または C++ からのみ直接使用できます。
ファイルを直接読み取ろうとする人はいません。代わりに、メタデータ API IMetaDataImport2を使用します。良い例は広く利用可能で、その名前はよくグーグルで検索されます。SSCLI20 プロジェクトには、ildasm と、このインターフェイスが使用されていることを示す C# コンパイラのソース コードがあります。CCI Metadata プロジェクトも同様に非常に有用であり、コンパイラの実装を支援するように設計されていますが、OCaml ではおそらく直接的には役に立たないでしょう。
IMetaDataImport は COM インターフェイスであるため、これを OCaml に移植する際の苦労の程度は、実装が COM をどれだけサポートしているかに大きく依存することに注意してください。
さて、PE ファイルと CLI メタデータの読み取りに関する関連情報をいくつか見つけました。具体的には、この記事http://wyday.com/blog/2010/how-to-detect-net-assemblies-x86-x64-anycpu/に C# のサンプル ソース コードと、PE/COFF 仕様へのリンクが含まれています。 CLI メタデータ仕様。彼らは始めるのに十分であるようです.
ただし、誰かがより具体的な情報/ソースコードの例を共有したい場合は、この質問を開いたままにします. 回答してくれた皆さん、ありがとうございました!
このコードは、開始するのに役立ちます
Assembly dLL = Assembly.LoadFile(assemblyPath);
foreach (Type type in dLL.GetTypes())
{
//...play with type here
}