CLR via C# 读书笔记(一)基本工具等
工具的使用
关于ILDASM.exe等工具,直接使用VS命令行执行即可。在开始菜单的,vs目录下Visual Studio Tools,如vs2013的Developer Command Prompt for VS2013。然后执行
D:\Program Files (x86)\Microsoft Visual Studio 12.0>ildasm
即可打开相应程序。
编译工具
csc.exe是代码编译工具,vs中调用的也是这个。手工执行方法同上。
如对以下代码编译:
1 namespace TestCSharp 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 System.Console.WriteLine("hi"); 8 } 9 } 10 }
D:\Program Files (x86)\Microsoft Visual Studio 12.0>csc.exe /out:Program.exe /t:exe /r:MSCorLib.dll D:\WorkSpaces\TestCSharp\TestCSharp\Program.cs
/out: 输出文件名称,默认为Program.exe
/t: 编译文件类型,默认为exe。还有winexe,appcontainerexe,moudle,library
/r:引用的文件,默认自动引用。 如果不自动引用MSCorLib.dll,使用/nostdlib。
响应文件
存储编译配置的文件,个人理解为类似于c++中的make文件。
如:MyProject.rsp
/out:MyProject.exe
/target:winwxe
csc.exe @MyProject.rsp File1.cs File2.cs
.Net FrameWork安装时有默认全局文件CSC.rsp,csc.exe执行时除了使用命令行提供的响应文件,还会查找全局CSC.rsp
使用/noconfig 可以忽略所有响应文件
元数据
使用ILDasm查看编译的文件,可以在View中查看相应的元数据。
托管PE文件包含:PE32(+)头,CLR头,元数据(Meta),IL。
元数据,包含 定义表、引用表、清单表。
(名称均是见名知义)
常用定义元数据表:
ModuleDef 模块
TypeDef 类型
MethodDef 方法
FieldDef 字段
ParamDef 参数
PropertyDef 属性
EventDef 事件
常用的引用元数据表:
AssemblyRef 引用的程序集
ModuleRef 引用的模块
TypeRef 引用的类型
MemberRef 引用的成员(字段、方法、属性方法和事件方法)
示例:
1 =========================================================== 2 ScopeName : TestCSharp.exe 3 MVID : {7835BE5C-A95F-46BE-85FA-E45FF54966F2} 4 =========================================================== 5 Global functions 6 ------------------------------------------------------- 7 8 Global fields 9 ------------------------------------------------------- 10 11 Global MemberRefs 12 ------------------------------------------------------- 13 14 TypeDef #1 (02000002) 15 ------------------------------------------------------- 16 TypDefName: TestCSharp.Program (02000002) 17 Flags : [NotPublic] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit] (00100000) 18 Extends : 01000001 [TypeRef] System.Object 19 Method #1 (06000001) [ENTRYPOINT] 20 ------------------------------------------------------- 21 MethodName: Main (06000001) 22 Flags : [Private] [Static] [HideBySig] [ReuseSlot] (00000091) 23 RVA : 0x00002050 24 ImplFlags : [IL] [Managed] (00000000) 25 CallCnvntn: [DEFAULT] 26 ReturnType: Void 27 1 Arguments 28 Argument #1: SZArray String 29 1 Parameters 30 (1) ParamToken : (08000001) Name : args flags: [none] (00000000) 31 32 Method #2 (06000002) 33 ------------------------------------------------------- 34 MethodName: .ctor (06000002) 35 Flags : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor] (00001886) 36 RVA : 0x0000205e 37 ImplFlags : [IL] [Managed] (00000000) 38 CallCnvntn: [DEFAULT] 39 hasThis 40 ReturnType: Void 41 No arguments. 42 43 44 TypeRef #1 (01000001) 45 ------------------------------------------------------- 46 Token: 0x01000001 47 ResolutionScope: 0x23000001 48 TypeRefName: System.Object 49 MemberRef #1 (0a000012) 50 ------------------------------------------------------- 51 Member: (0a000012) .ctor: 52 CallCnvntn: [DEFAULT] 53 hasThis 54 ReturnType: Void 55 No arguments.
Tip: .ctor是构造函数
常用清单元数据表:
AssemblyDef 程序集信息
FileDef 文件信息
MainfestResourceDef 资源文件信息
ExportedTypesDef 导出的public类型的记录
AL.exe
程序集链接器
/link 资源文件
标准的win32资源(如果*.res,*ico),直接可使用/win32res
/c: 本地化,如“en-US”
浙公网安备 33010602011771号