Можно ли проверить сборку .NET независимо от других сборок, на которые она может ссылаться? - PullRequest
4 голосов
/ 13 ноября 2011

Другими словами: для проверки сборки .NET нужно ли читать и анализировать какую-либо из упомянутых сборок?Что делает инструмент PEVerify?

1 Ответ

7 голосов
/ 13 ноября 2011

Краткий ответ: да, PEVerify необходимо загрузить ссылочные сборки.

Формат сборки довольно автономен. Но действительно есть несколько вещей, которые PEVerify должен проверять в ссылочных сборках.

Общие экземпляры

В сборке, когда вы используете универсальный тип или универсальный метод, исходный универсальный арность не сохраняется, и вам необходимо загрузить определение типа или метода, чтобы правильно проверить создание экземпляров, как для арности ( имеет ли экземпляр правильное число универсальных аргументов?) и для ограничений (универсальный аргумент удовлетворяет универсальному ограничению, указанному в универсальном параметре?). Проверка не будет выполнена, если PEVerify не сможет найти ссылочные сборки.

Доступ к ссылочным элементам

Если вы вызываете метод или манипулируете полем, определенным в другой сборке, PEVerify попытается загрузить сборку, определяющую элемент, чтобы проверить, имеет ли элемент соответствующую видимость.

Не удастся проверить, не удалось ли найти сборку, в противном случае будет выдана ошибка «Невозможно разрешить токен».


Есть пара других случаев, когда для правильного чтения фрагмента метаданных необходимо разрешить ссылку на тип и, следовательно, загрузить содержащую его сборку, но я не думаю, что PEVerify проверяет их:

Создание экземпляра пользовательского атрибута, содержащего перечисления:

Например:

[AttributeUsage (AttributeTargets.Field)] * ​​1024 *

Вы должны загрузить определение AttributeTargets, чтобы знать, что оно поддерживается int32, охватывающим более 4 байтов, в форме сериализованного пользовательского атрибута.

Поля, значения которых сериализуются в двоичной форме:

Некоторые компиляторы могут решить сохранить постоянное значение в двоичном виде в сборке. В случае, когда тип константы не является известным примитивом, необходимо разрешить ссылку на этот тип, чтобы узнать ее размер.


Но опять же, я не думаю, что PEVerify проверяет эти случаи. Я на самом деле почти уверен, что он не проверяет кодировку пользовательских атрибутов, для второго пункта я не уверен.

...