runtime和internalcall到底是什么,这个问题也许很多人连这个问的是什么都不清楚。runtime和internalcall是msil里面对方法的一种修饰,也可以认为是一个Attribute。和这两个修饰类似的还有managed和unmanaged,当然还有其它的,但是也许熟悉的也就只有这两个了。runtime、internalcall、managed、unmanaged等等都是直接在MetaData里面共用一个字节进行标注的,也就是说每一个函数都会被修饰。大部分的方法都会被打上managed il 这两个标识,偶尔也许你能够看到unmanaged和native这两个标识。但是我想大部分的人都不会知道原来还有runtime和internalcall,我知道有这两个东西的存在,但是不知道有什么用。
前两天研究Delegate又看到runtime了,还在我和dudu之间引发了一些讨论,当然,所围绕的中心并不是runtime是什么。可是我一贯的好奇心使得我再次对这个东西提起了兴趣,于是我就只好到处找资料。到Google上面找,似乎没有找到。找MSDN甚至是Tools Developer里面的资料,语焉不详。后来忍不住问了思归,思归倒是很快给出了一些相关的网上的信息。需要说明的是,这些信息都很有用,也和我的问题相关,但是似乎并不是讨论里面的机制问题,而是打了一个擦边球。
简单点讲,在MSDN或者Tools Developer上面,你可以看到一些很简单的说法:
runtime是指由运行时提供的,用runtime修饰的函数不应该有函数体。
internalcall是指由运行库实现的(MSDN里面这么说的),这样修饰的函数可以访问由BCL(BaseClassLibrary)提供的unmanaged的wrapper,以实现更加底层的功能(Tools Developer里面的说法,具体由没有说错不敢保证,现在不是对着这个document说的)。
看了半天,我的疑惑还是没有搞清楚:
runtime到底是动态生成的呢?还是由运行库的静态代码在运行时提供的呢?
internalcall又是一个什么样的情况呢?和runtime到底有什么实质性的区别?(或者说,假如我是MS的CLR项目组成员,那么应该有人来告诉我,什么时候用runtime,什么时候用internalcall。)
目前我只知道如下结论:
1、runtime几乎只能够在用户定义的delegate里面出现。
2、internalcall别的地方不清楚,但是在RuntimeType类里面则是很容易就能够找到的。
有没有人能够告诉我,到底runtime和internalcall有什么区别?(希望真的有MS的人给我讲讲,我好奇的很。)