包含托管代码和非托管代码混合的.NET程序集不能与其他程序集进行ILMerged。
如何验证给定的.NET程序集是包含纯托管代码,还是包含托管代码和非托管代码的混合代码?
答案 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上面提供的答案......
找到您的" PEVerify.exe" - 如果安装了VS,则可以使用它.-复制PEVerify.exe文件的完整路径,您的路径会有所不同 - 例如:C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools \ PEVerify.exe
打开Visual Studio命令提示符(不要"以管理员身份运行")
输入:cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools
你的命令提示符现在应该是这个长文本,而不仅仅是C:\或者......它将指向PEVerify.exe所在的路径。
现在输入:peverify "your full path to your dll you want to check
- 按Enter键 - 这是我的示例:peverify" G:\ TestFolder \ My_Managed_OR_Unmanaged.dll"
按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)
...