Какова цель поля отсортированного битового вектора в заголовке метаданных ~ в сборке .NET?

Согласно метаданным раздела II, в нем говорится, что допустимое поле — это битовая маска, которая отмечает, какие таблицы метаданных CLR присутствуют в исполняемом файле .NET, но я не могу понять, для чего предназначено поле «отсортировано» — каково его значение и что я должен вводить в это поле при создании собственных переносимых исполняемых образов .NET?


person plaureano    schedule 25.10.2009    source источник


Ответы (2)


Я думаю, что отсортированное поле просто намекает, отсортирована ли конкретная таблица метаданных или нет (это битовое поле, как и действительное).

Это позволило бы реализации среды выполнения выполнять бинарный поиск в таблице непосредственно из данных, отображаемых в память.

person Foxfire    schedule 25.10.2009

РЕДАКТИРОВАТЬ: это не ответ, я неправильно понял вопрос как относящийся к полю «Действительно», а не к полю «Отсортировано», но я оставляю его здесь на случай, если он связан с ответом

Поле «Действительно», о котором вы говорите, описано в Раздел II, §24.2.6, со следующей соответствующей частью:

Поле Valid — это 64-битный битовый вектор, в котором для каждой таблицы, хранящейся в потоке, установлен определенный бит; отображение таблиц в индексы дано в начале §22. Например, когда в логических метаданных присутствует таблица DeclSecurity, в векторе Valid должен быть установлен бит 0x0e. Недопустимо включать несуществующие таблицы в Valid, поэтому все биты выше 0x2c должны быть равны нулю.

Каждый подраздел раздела 22, начиная с §22.2, описывает одну таблицу и дает ее битовый индекс. Например, §22.2 называется «Сборка: 0x20». Это означает, что если и только если таблица Assembly, описанная в §22.2, присутствует в вашем PE, то в поле Valid должен быть установлен бит 0x20. Обратите внимание, что это НЕ означает, что Valid & 0x20 == 0x20, это означает, что должен быть установлен 0x20-й (т.е. 32-й) бит Valid, то есть Valid & (1 << 0x20) == (1 << 0x20).

Некоторое время я не был уверен, был ли он индексирован 0 или 1, поэтому я предположил, что он индексирован 0. Но теперь я точно знаю, что он 0-индексирован, потому что таблица Module — это таблица 0x00.

person Doug McClean    schedule 25.10.2009