我正在开发一个并行构建工具,它可以构建(在许多其他东西中)各种类型的Windows程序。我们的工具的一部分让我们的用户更轻松的生活是EXE和DLL文件的自动依赖性扫描。这意味着,如果用户说他们想要运行“bob.exe”,那么当“bob.exe”被分发到构建网络中的其他节点时,他们不必担心依赖性问题。这是因为我们扫描“bob.exe”找出它需要的DLL并将它们与它一起发送。
总的来说这很有效,除非EXE以编程方式加载DLL。然后必须将依赖项硬编码到用户make文件中。我们最近开始遇到的一个问题是如何处理C#DLL / EXE。这些似乎包含DLL引用,它们不是PE格式的一部分。我假设引用在某种C#容器中,并且C#运行时只是在C#运行时启动时以编程方式加载它们。
有谁能告诉我在二进制级别扫描这些引用的最佳方法是什么?我的构建工具是多平台的,因此我的PE扫描程序用Java编写。因此,我不能依赖任何.NET库。我的PE扫描程序已经可以解析PE文件中的所有部分,我习惯解析包含C ++应用程序的并排程序集信息的部分。我只需要一些关于在C#应用程序中做什么的指示......
答案 0 :(得分:5)
.NET程序集的格式由标准ECMA-335 "Common Language Infrastructure (CLI)"定义,特别是“Partition II:Metadata Definition and Semantics”,可免费下载。您可以使用它为它们编写自己的Java解析器来提取引用。
答案 1 :(得分:2)
您可以使用pe-file-reader库(或从中获取灵感):
这个库读取.net程序集和 .net模块文件(可移植可执行文件 文件;托管可执行文件)。 。净 存储模块和汇编文件 根据{{3}}标准。