1

我希望我的应用程序(用 ocaml 编写)读取托管 DLL 并检索其中包含的类定义。我在哪里可以找到有关如何执行此操作的公共文档/示例代码?

[编辑:由于我在 ocaml 中编写此应用程序,因此我正在寻找实际的文件格式定义,因为我不能使用 .NET 自己的程序集检查功能]

谢谢!

4

3 回答 3

2

没有可用的正式文件规范,主要是因为它可能会更改并且已经更改了多次(.NET 1.1、2.0 和 4.0)。Ecma 335中提供了程序集清单中元数据表的结构描述。Windows SDK 的 CorHdr.h 文件包含必要的声明,但只能在 C 或 C++ 中直接使用。

没有人试图直接读取文件。相反,您使用元数据 API IMetaDataImport2。很好的例子随处可见,谷歌的名字很好。SSCLI20 项目有 ildasm 的源代码和显示该接口正在使用的 C# 编译器。CCI 元数据项目也可能非常有用,旨在帮助您实现编译器,简而言之,它可能无法直接在 OCaml 中使用。

请注意,IMetaDataImport 是一个 COM 接口,因此尝试将其移植到 OCaml 所承受的痛苦程度在很大程度上取决于您的实现对 COM 的支持程度。

于 2012-12-17T17:49:28.563 回答
1

此代码应该可以帮助您开始

 Assembly dLL = Assembly.LoadFile(assemblyPath);
 foreach (Type type in dLL.GetTypes())
 {
  //...play with type here
 }
于 2012-12-17T16:16:48.407 回答
1

好的,我找到了一些有关读取 PE 文件和 CLI 元数据的相关信息。具体来说,这篇文章http://wyday.com/blog/2010/how-to-detect-net-assemblies-x86-x64-anycpu/有一个 C# 示例源代码和PE/COFF 规范的链接,以及CLI 元数据规范。似乎它们足以开始。

不过,如果有人想分享更具体的信息/示例源代码,我仍然会保留这个问题。再次感谢所有回答的人!

于 2012-12-18T03:22:07.367 回答