<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>
CorFlags是.NET Framework中一个用于查看.NET 可执行文件(PE)的运行参数的非常有用的工具,但是这个工具输出的结果不是特别直观,文档中并没有做出解释,本文将用实际例子解释CORFLAGS的用法。
首先我们来看一个一般的情况,随便写一个A.CS文件,用CSC编译,并用CorFlags察看
> csc a.cs > corflags a.exe Microsoft (R) .NET Framework CorFlags Conversion Tool.Version2.0.50727.42 Copyright (c) Microsoft Corporation.All rights reserved. Version : v2.0.50727 CLR Header: 2.5 PE : PE32 CorFlags: 1 ILONLY : 1 32BIT : 0 Signed : 0 |
先解释一下每一项的意义:
项目 | 含义 | 对应 |
Version | Assembly所对应的Framework版本 | IMAGE_COR20_HEADER.dwMajorRuntimeVersion IMAGE_COR20_HEADER.dwMinorRuntimeVersion |
CLR Header | CLR文件头的版本号 | IMAGE_COR20_HEDER.MetaData |
PE | PE文件的类型,包含PE32/PE32+ | Magic= IMAGE_NT_OPTIONAL_HDR32_MAGIC or IMAGE_NT_OPTIONAL_HDR64_MAGIC |
CorFlags | | IMAGE_COR20_HEADER.Flags CorFlags根据这个值来解析下面的选项 |
ILONLY | 是否仅仅包含IL代码,0/1 | COMIMAGE_FLAGS_ILONLY=0x1 |
32 BIT | 是否仅以32BIT运行,0/1 | COMIMAGE_FLAGS_32BITREQUIRED=0x2 |
Signed | 是否经过签名 | COMIMAGE_FLAGS_STRONGNAMESIGNED =0x8 |
PE文件的类型需要解释一下,Windows中PE文件也就是可执行文件,存在两种类型(以前还有LE等等,已淘汰):PE32和PE32+
PE32是既可以在32位下运行,也可以在64位下运行,而PE32+只能在64位下面运行。这里有一点需要澄清的是,普通的PE32文件,如果里面代码有非托管代码,那么只能以32位运行,不管是在32位Windows还是64位的Windows。但是如果PE32中仅含有托管代码,那么在64位Windows下面则可以以64位运行,因为CLR可以将托管代码编译为64Bit并运行,并且将其作为PE32+对待。
对应不同的平台的托管代码对应的CorFlags的结果是不一样的。
平台 | PE32/PE32+ | IL Only? | 32-Bit? |
Any CPU | PE32 | 1 | 0 |
Pure x86 | PE32 | 1 | 1 |
Pure x64 | PE32+ | 1 | 0 |
Mixed x86 | PE32 | 0 | 0 |
Mixed x64 | PE32+ | 0 | 0 |
Pure指纯托管程序,而Mixed指混合。
Any CPU必然只能是IL Only,不能含有平台相关的非托管代码。而x86和AnyCPU一样,都是PE32文件,区别在于文件头上的32-Bit的标志设置为1,表明其只能以32-Bit运行。X64则必然是PE32+,可以包含64位非托管代码。
举一个例子:
> corflags C:\windows\microsoft.net\Framework\v2.0.50727\System.dll Microsoft (R) .NET Framework CorFlags Conversion Tool.Version2.0.50727.42 Copyright (c) Microsoft Corporation.All rights reserved. Version : v2.0.50727 CLR Header: 2.5 PE : PE32 CorFlags: 9 ILONLY : 1 32BIT : 0 Signed : 1 |
可以看到我机器上面32Bit的.NET Framework 2.0 RTM版本里面的System.DLL是对应v2.0.50727版本的,属于PE32文件,是IL Only,不是32Bit的,因此这个是用AnyCPU来编译的。Corflags = 9 = COMIMAGE_FLAGS_ILONLY (1) + COMIMAGE_FLAGS_STRONGNAMESIGNED (8)
最后我们来看一个混合托管代码和非托管代码的例子:
>cl /clr a.cpp Microsoft (R) C/C++ Optimizing Compiler Version 14.00.50727.762 for Microsoft (R) .NET Framework version 2.00.50727.1416 Copyright (C) Microsoft Corporation.All rights reserved. a.cpp Microsoft (R) Incremental Linker Version 8.00.50727.762 Copyright (C) Microsoft Corporation.All rights reserved. /out:a.exe a.obj > corflags a.exe Microsoft (R) .NET Framework CorFlags Conversion Tool.Version2.0.50727.42 Copyright (c) Microsoft Corporation.All rights reserved. Version : v2.0.50727 CLR Header: 2.5 PE : PE32 CorFlags: 0 ILONLY : 0 32BIT : 0 Signed : 0 |
可以看到用/CLR编译选项编译出来的C++/CLI的代码总是混合的,因此是 ILONLY=0,值得注意的是其32BIT=0,说明当ILONLY=0的时候,CLR不需要32BIT=0就可以判断出这个PE32文件必然要在32BIT下面运行。
CorFlags除了可以输出这些信息之外,还可以一定程度上修改这些信息,用法比较简单,只要了解各个输出的含义就可以了。但是除非对相关信息的含义以及对目标程序非常了解,一般情况下最好不要修改这些信息,以避免出现无法预料的问题。
作者: 张羿(ATField)
Blog: http://blog.csdn.net/atfield
http://blogs.msdn.com/yizhang
转载请注明出处
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1814408
分享到:
相关推荐
.net core sdk包2.2.101,
该资源下载安装之后,可修复系统缺失资源 操作简单,一键修复
dotnet-sdk-8.0.101-win-x86.exe 适用于windows x86系统
本文将深入探讨Anycad.net.SDK的核心功能、工作原理以及其在实际应用中的价值。 Anycad.net.SDK是一款面向开发者的设计工具包,它允许程序员通过编程方式与CAD文件进行交互。这一SDK的核心亮点在于其转换能力,能够...
ArcGIS Runtime SDK for .NET 100.6.0 官方实例代码,其中包括– UWP, WPF, Xamarin.Android, Xamarin.iOS, and Xamarin.Forms 。
dotnet-sdk-8.0.101-win-x64.exe 适用于windows x64系统
标题中的"awesomium_v1.6.6_sdk_win.exe"是一款针对Windows平台的Awesomium SDK的安装程序,版本为1.6.6。Awesomium是一个开源项目,它提供了一个Web渲染引擎,使开发者能够在桌面应用程序中嵌入高性能的Web浏览功能...
2. **LICENSE.txt**:包含了.NET SDK的许可协议,详细说明了软件的使用条件和限制。 3. **host**:这部分包含了运行时主机,它负责启动.NET应用程序,解析依赖项,并将控制权交给应用的主要入口点。 4. **shared**...
dotnet-sdk-8.0.100-preview.3.23178.7-win-x64.exe
dotnet-sdk-5.0.202-win-x64.exe
8. **文档和示例**:为了便于学习和使用,SDK 包含详尽的文档和示例代码,帮助开发者快速上手并掌握各种功能的使用方法。 9. **持续集成与更新**:版本号v5.0.25.631表明SDK经过多次迭代和改进,保证了与最新技术的...
aximp.exe是ActiveX导入工具,主要用于将ActiveX控件转换为.NET Framework的托管代码组件,以便于在.NET环境中使用。而Lc.exe则是资源编译器,它负责处理应用程序中的本地化资源,如字符串、图像等,并将它们编译到...
iBATIS.NET SDK for .NET 2.0.chm
依赖环境:.NET Framework 4.5+ 和 .NET Core 2.1
6. **工具集**:可能包含集成开发环境(IDE)插件,如Visual Studio或Delphi的扩展,以便于在这些环境中直接使用RemObjects SDK。 7. **多平台支持**:RemObjects SDK支持多个.NET框架版本,以及跨平台的目标,如...
RemObjects SDK for .NET 6.0.39.777 (FIXED).rar
sdk-dotnet, 用于 Authorize.Net API的.NET SDK Authorize.Net. NET SDK 要求.NET 3.5或者更高版本Nunit 2.6.3 ;Authorize.Net 帐户( 请参见下面的注册&配置部分) 1.2Authorize.Ne
.net框架需要
dotnet-sdk-8.0.101-win-arm64.exe 适用于windows arm64系统
6. **许可证包含**: "Retail.Include.License"标签表明此版本是零售版,包含完整的许可证信息,这意味着购买者有权在商业项目中使用这个SDK,而不仅仅是评估或个人用途。 7. **安装文件**: 包含的“RemObjects_SDK_...