【问题标题】:What is the purpose of the sorted bit vector field in the "~" Metadata header in a .NET assembly?.NET 程序集中“~”元数据标头中排序位向量字段的用途是什么?
【发布时间】:2009-10-25 00:39:03
【问题描述】:

根据分区 II 元数据,它说有效字段是一个位掩码,它指出了 .NET 可执行文件中存在哪些 CLR 元数据表——但我不知道“排序”字段是什么for--它的意义是什么?在创建我自己的 .NET 可移植可执行映像时,我应该在这个字段中发出什么?

【问题讨论】:

    标签: .net clr metadata low-level


    【解决方案1】:

    我认为排序字段只是提示特定元数据表是否已排序(它是一个位字段,就像有效一样)。

    这将允许运行时的实现直接从 memmapped 数据中对表进行二进制搜索。

    【讨论】:

      【解决方案2】:

      编辑:这不是答案,我将问题误认为是关于 Valid 字段而不是 Sorted 字段,但我将其留在这里以防它与答案相关

      您所说的“有效”字段在Partition II, §24.2.6 中有描述,相关部分如下:

      有效字段是一个 64 位的位向量,它为存储在流中的每个表设置了一个特定的位;表到索引的映射在第 22 节的开头给出。例如,当逻辑元数据中存在 DeclSecurity 表时,应在 Valid 向量中设置位 0x0e。 Valid 中包含不存在的表是无效的,因此 0x2c 以上的所有位都应为零。

      从第 22.2 节开始的第 22 节的每个小节都描述了一个表,并给出了它的位索引。例如,§22.2 的标题为“Assembly: 0x20”。这意味着,当且仅当第 22.2 节中描述的汇编表存在于您的 PE 中时,必须在 Valid 字段中设置位 0x20。注意这里NOT表示Valid & 0x20 == 0x20,表示Valid的第0x20位(即第32位)必须设置,即Valid & (1 << 0x20) == (1 << 0x20)

      有一段时间我不确定它是 0 索引还是 1 索引,所以我假设它是 0 索引。但我现在确定它是 0 索引的,因为 Module 表是表 0x00。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-11
        • 2010-10-01
        • 1970-01-01
        • 2020-04-19
        • 2015-03-03
        • 2021-06-18
        • 2012-04-15
        • 1970-01-01
        相关资源
        最近更新 更多