我注意到接口类型定义元数据如下所示:
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行”的位,那一定是正在发生的事情,所以这个问题就完成了。
答案 0 :(得分:3)
它是一个'元数据标记',它引用程序集元数据中表中的项。第一个十六进制对表示表类型,接下来的3对只是表行的序列号。表0x01是TypeRef表,表0x02是TypeDef表。
在Ecma-335(公共语言基础设施的标准文件)中详细描述了这一点。
错过了这个问题,添加:接口类型不必继承任何东西。与总是派生自System.Object的类不同。这使元数据令牌0x01000000可能意味着“没有”。但是,实际的表条目并不固定,您通常需要查看表格。伊达斯姆为你做了。