原文:http://www.blogcn.com/user8/flier_lu/index.html?id=3270482
在使用 reflector.net 或者 rotor 源码查看 bcl 库的实现时,经常会碰到一些被标记为 internalcall 的方法.如 system.string 中用于获取字符串长度的 length 属性,实现上就是调用被标记为 internalcall 的 string.internallength 方法: 【程序编程相关:中英文字符混合处理方法】【推荐阅读:asp.net窗体的打开和关闭】
以下内容为程序代码: 【扩展信息:在 ASP.NET 中执行 URL 重写】namespace system{ [serializable] public sealed class string : ... { [methodimpl(methodimploptions.internalcall)] private int internallength(); public int length { get { return this.internallength(); } } }} 这些方法因为执行效率.安全性或者为了实现简单等不同原因,通过 il 代码以外的 native code 形式提供实现代码.但与通过 dllimport 定义的 interoper 方法不同的是,他们无需被定义为 static extern 方法,也无需通过单独的 dll 导出函数被实现.它们作为 clr 的诸多内部调用方式之一,被封装在一个看似密不透风的盒子里面,通过一个 internalcall 的函数定义,将函数最终使用者与函数功能提供者隔离开来. 但实际使用中为了分析 clr 运行机制与调试,我们经常性需要了解与分析这类函数.下面将从 clr 内部使用与实现 internalcall 函数的不同角度,对其做一个粗略的分析. 作为一个 bcl 函数,被定义成 internalcall 的函数使用上与普通 il 函数没有任何区别.... 下一页