接口的Msil元数据包括“Extends:01000000 [TypeRef]” - 01000000是什么意思?

时间:2011-03-05 00:34:25

标签: .net cil

我注意到接口类型定义元数据如下所示:

TypDefName: Interfaces.IMyInterface  (02000003)
Flags     : [Public] [AutoLayout] [Interface] [Abstract] [AnsiClass]  (000000a1)
Extends   : 01000000 [TypeRef]

而我创造的其他一切,例如class,enum,struct,有一个扩展条目,如下所示:

Extends   : 01000001 [TypeRef] System.Object

(如果类型不直接继承,则将System.Object替换为其他类名):

所以,我的问题是:

“01000000”只是一个表示“界面”的幻数吗?如果是这样,还有其他情况会发生类似情况吗?

更新

System.Object的条目是相同的:

TypDefName: System.Object  (02000002)
Flags     : [Public] [AutoLayout] [Class] [Serializable] [AnsiClass] [BeforeFieldInit]  (00102001)
Extends   : 01000000 [TypeRef]

...实际上所有接口都是一样的:

TypDefName: Interfaces.IMyOtherInterface  (02000007)
Flags     : [Public] [AutoLayout] [Interface] [Abstract] [AnsiClass]  (000000a1)
Extends   : 01000000 [TypeRef] 
InterfaceImpl #1 (09000002)

这符合汉斯回答中所列文件的内容。

所以,即使我找不到实际上说“interfaces和System.Object不需要TypeDef行”的位,那一定是正在发生的事情,所以这个问题就完成了。

1 个答案:

答案 0 :(得分:3)

它是一个'元数据标记',它引用程序集元数据中表中的项。第一个十六进制对表示表类型,接下来的3对只是表行的序列号。表0x01是TypeRef表,表0x02是TypeDef表。

在Ecma-335(公共语言基础设施的标准文件)中详细描述了这一点。

错过了这个问题,添加:接口类型不必继承任何东西。与总是派生自System.Object的类不同。这使元数据令牌0x01000000可能意味着“没有”。但是,实际的表条目并不固定,您通常需要查看表格。伊达斯姆为你做了。