如何确定.NET程序集是否包含非托管代码?

时间:2009-12-22 13:16:36

标签: .net assemblies unmanaged native

包含托管代码和非托管代码混合的.NET程序集不能与其他程序集进行ILMerged。

如何验证给定的.NET程序集是包含纯托管代码,还是包含托管代码和非托管代码的混合代码?

8 个答案:

答案 0 :(得分:9)

正如nobugz所建议的,查看CLR Flags的更简单方法是使用corflags实用程序,它是.NET 2.0 SDK的一部分。

如果未指定选项,则显示给定图像的标志:

C:\>corflags Foo.dll
Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 9
ILONLY    : 1
32BIT     : 0
Signed    : 1

“ILONLY”位表示这是纯粹的托管程序集还是混合程序集。

请注意,用户'nobugz'的评论表明这些标记不保证是正确的,因此这种方法可能不是万无一失。

答案 1 :(得分:5)

针对您的程序集运行PEVerify工具。

PEVerify.exe与Visual Studio一起安装,例如:这个附带Visual Studio 2012:

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\PEVerify.exe

答案 2 :(得分:3)

从Visual Studio命令提示符运行ildasm,如下所示:

  

ildasm file.exe / headers / noil / text

在输出结束时,您将看到以下内容:

  

// ----- CLR标题:
  //标题大小:...
  //主要运行时版本:...
  //次要运行时版本:...
  // ...   //标志:0x00000000

如果Flags的位设置最低(例如0x00000001),那么程序集是纯CLR;如果不是(例如0x00000000)则组件是混合模式。请注意,可能存在其他标志,因此它只是您感兴趣的最低位(因此,如果最后一位是1,3,5,7,9,b,d或f,则它是纯CLR)。

(编辑:您还可以以图形方式运行ildasm,打开相关的可执行文件,然后从“视图”菜单中选择“标题”以查看相同的信息。)

答案 3 :(得分:1)

改善Wim上面提供的答案......

  1. 找到您的" PEVerify.exe" - 如果安装了VS,则可以使用它.-复制PEVerify.exe文件的完整路径,您的路径会有所不同 - 例如:C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools \ PEVerify.exe

  2. 打开Visual Studio命令提示符(不要"以管理员身份运行")

  3. 输入:cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools

  4. 你的命令提示符现在应该是这个长文本,而不仅仅是C:\或者......它将指向PEVerify.exe所在的路径。

  5. 现在输入:peverify "your full path to your dll you want to check - 按Enter键 - 这是我的示例:peverify" G:\ TestFolder \ My_Managed_OR_Unmanaged.dll"

  6. 按Enter键后,您收到如下消息,其100%托管的dll - My_Managed_OR_Unmanaged.dll中的所有类和方法已验证。"

答案 4 :(得分:0)

我必须仔细检查这个,但我很确定你可以通过redgate找到Reflector。

答案 5 :(得分:0)

ILMerge仅合并托管程序集here,以引用其下载页面,“ ILMerge是一个用于将多个.NET程序集合并到单个.NET程序集中的实用程序”。

我没有看到托管程序集与本机二进制文件合并。从技术上讲,您可以通过将非托管二进制文件包含为嵌入式资源,将嵌入式资源作为二进制代码加载到内存中来实现它们本身的合并 - 我之前没有看到过这种情况。我使用内存映射尝试了这种技术,但失败了。

另一种检查方法是查看二进制文件本身,如果它在数据目录中有第15个条目,并且非零,则它是.NET二进制文件,本机二进制文件没有这个。请参阅here我在哪里发布了类似问题的答案。

希望这有帮助, 最好的祝福, 汤姆。

答案 6 :(得分:0)

我认为您应该使用.NET反射来遍历程序集中的所有类型和方法。

答案 7 :(得分:0)

要从C#获取PE标志,请使用System.Reflection API:http://www.example8.com/category/view/id/6027

...

Assembly a = Assembly.GetExecutingAssembly();
Module m = a.ManifestModule;

PortableExecutableKinds peKinds;
ImageFileMachine imageFileMachine;
m.GetPEKind(out peKinds, out imageFileMachine);

if ((peKinds & PortableExecutableKinds.ILOnly) != 0)

...