Что означает IL ".custom instance void [attribute] = (...)"? - PullRequest
0 голосов
/ 18 января 2019

Когда я использовал ключевое слово params для параметра, я нашел эту строку в IL. Из этого я понял, что вызывается конструктор класса ParamArrayAttribute, но я не понимаю, что означает 01 00 00 00.

.custom instance void [mscorlib]System.ParamArrayAttribute::.ctor() = (
            01 00 00 00
        )

Ответы [ 2 ]

0 голосов
/ 18 января 2019

См. Раздел II.21 спецификации C # (версия 6), определенной в ECMA-335 :

Custom attributes are declared using the directive .custom, followed by the method
declaration for a type constructor, optionally followed by a Bytes in parentheses:
CustomDecl ::=
    Ctor [ ‘=’ ‘(’ Bytes ‘)’ ]

Формат сегмента Bytes определен в разделе II.23.3:

CustomAttrib starts with a Prolog – an unsigned int16, with value 0x0001.
...
Next is a description of the optional “named” fields and properties. This starts with
NumNamed – an unsigned int16 giving the number of “named” properties or fields that
follow. Note that NumNamed shall always be present. A value of zero indicates that there
are no “named” properties or fields to follow (and of course, in this case, the
CustomAttrib shall end immediately after NumNamed).

Примеры различных пользовательских атрибутов приведены в разделе VI.B.3.

В случае ParamArrayAttribute первые два байта (01 00) равны Prolog (в формате с прямым порядком байтов), а последние два байта (00 00) равны NumNamed (0 = нет). аргументы).

0 голосов
/ 18 января 2019

При использовании для украшения элементов атрибуты могут содержать параметры инициализации, которые будут отправлены в конструктор атрибута.

Для экземпляра

[DataMember(EmitDefaultValue = true)]
public int Property { get; set; }

скомпилировано в

.custom instance void
[System.Runtime.Serialization]System.Runtime.Serialization.DataMemberAttribute::.ctor() = 
( 01 00 01 00 54 02 10 45 6D 69 74 44 65 66 61 75 6C 74 56 61 6C 75 65 01 )

Последовательность кодов байтов, которую вы видите, соответствует инициализации параметра EmitDefaultValue.

В вашем случае

01 00 00 00

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

...