银河

SKYIV STUDIO

  博客园 :: 首页 :: 博问 :: 闪存 :: :: :: 订阅 订阅 :: 管理 ::

.NET探秘:MSIL权威指南》,[加]Serge Lidin 著,包建强 译,人民邮电出版社,2009年9月第1版

Expert .NET 2.0 IL Assembler译者笔记


 

第1章 简单示例 (第2页至第20页)

 

第3页,倒数第4自然段 IL代码由CLR“托管”。CLR托管至少包括三个主要的活动:类型控制、结构化异常处理和垃圾收集。类型控制涉及在执行期间项类型的验证和转换。托管异常处理在功能上与“非托管的”结构化异常处理类似,但它是由CLR执行的而不是由操作系统执行的。垃圾收集涉及对不再使用的对象进行自动标识和释放。

上述段落中红色的“结构化异常处理”应该是“托管异常处理”。(请参阅2楼的评论,等我看完“第14章 托管异常处理”之后再说)

 

第11页,第1自然段

调用约定、返回类型和方法参数的类型,定义了 MethodDef 的签名。

似乎应该再加上“方法名称”才能构成 MethodDef 的签名。(请参阅2楼的评论)

 

第11页,第5自然段

例如 locale init (int 32 Retval, String Tempstr)。

应该是: 例如 locals init (int32 Retval, string Tempstr)。。

 

第12、14、15页

Odd.or.Even::Check

上述的 Check 应该是 check 。

 

第16页,倒数第1自然段

显然,可以将任何数据逐字表示为 bytearray。例如,不在 ldstr "Enter a number" 中使用带有引号的字符串,而是使用字符串的 bytearray 表示。

上述段落中的 "Enter a number" 应该是 "odd!" 。

 

第17页,倒数第1自然段

特性 pinvokeimpl("msvcrt.dll" cdecl) 指出这是一个非托管方法,要使用称为 P/Inkoke (Platform Invocation,平台调用) 的机制调用。这个特性还指出了这个方法驻留于非托管的 Msbcrt.dll 中,并拥有调用约定 cdecl。这个调用约定意味着非托管方法处理参数的方式与 ANSI C 函数相同。

上述段落中的 P/Inkoke 应该是 P/Invoke (第18页还有三处), Msbcrt.dll 应该是 msvcrt.dll 。

 


 

第2章 代码增强 (第21页至第28页)

 

第21页,倒数第1自然段 让我们看一下这个稍许修改的简单示例(源文件 Simple.il ),如代码清单 2-1 如示。此刻,我感兴趣的部分是改动的部分。我对改动的地方使用注释 CHANGE! 进行了标注。

上述段落中 Simple.il 应该是 Simple1.il 。

 

第22页,代码的最后部分 //----------- 调用非托管方法
.method public static pinvokeimpl ("msvcrt.dll" cdecl)
    vararg int32 sscanf(string, string) cil managed { }

最后一行之后应该加上 // CHANGE!

 

第23页,第5自然段 我的同事为了找到用于自动测试程序生成的特殊方法,对使用 Visual C#.NET 和 Visual Basic.NET 编写的原始程序进行了编译,并将生成的可执行体进行反编译,然后插入特定于测试的 ILAsm 部分,并重新编译这段修改过的代码,成为新的可执行体

上述的 Visual C#.NET 应该是 Visual C# (第24页第一行还有一处),“反编译”应该是“反汇编”,“重新编译”应该是“重新汇编”,最后的逗号应改为句号。

 

第23页,第6自然段 注意示例中的另一个改变是,指令 ldc.i4 1 被 ldc.i4.1 代替。这里的逻辑和使用 ldloc Retval 代替 ldloc.0 一样,换句话说,使用快捷的操作码而避免使用4字节整数的参数。

上述的“使用 ldloc Retval 代替 ldloc.0”应该是“指令 lodloc Retval 被 ldloc.0 代替”。

 


 

第3章 使代码更简单 (第29页至第35页)

 

第30页,倒数第1自然段 就在程序头的后面,我定义了类 [mscorlib]System.Console 的别名以及它的方法 WriteLine(string) 。

应该是:就在程序头的后面,我定义了类 [mscorlib]System.Console 以及它的方法 WriteLine(string) 的别名。

 

第33页,倒数第1自然段 □ #include "MyHeaderFile.il": 有效地将 MyHeader.dl 文件的内容插入到当前的位置。

上述的 MyHeader.dl 应该是 MyHeaderFile.il 。

 

第34页,下部 关键字 .this 表示当前类(就像 C++/C# 的关键字 this,而不是当前类的实例)。当在类的作用域外使用时,这个关键字会引起编译错误。在这个示例中,下面的代码是不对的

前面括号的红字应该是:而不像在 C++/C# 中的 this 关键字那样表示类的当前实例,而后面的“是不对的”应该删除。

 


待续...

posted on 2009-11-18 10:35  银河  阅读(2283)  评论(3编辑  收藏  举报