Определение пользовательских атрибутов в CIL - PullRequest
4 голосов
/ 11 июня 2010

Каков синтаксис для определения литерала массива в CIL с целью украшения элемента с помощью пользовательского атрибута?

Я пишу некоторый код .NET в CIL (используя ilasm.exe для его компиляции)и мне нужно украсить метод с пользовательским атрибутом.Конструктор для этого атрибута принимает массив целых чисел в качестве единственного параметра.Как я могу сделать это в CIL?

Это подпись конструктора пользовательского атрибута (я не могу его изменить):

public FooAttribute(int[] values) {
// some hidden constructor stuff
}

Так я бы украсил свой методесли бы я писал на C # (но я не могу):


[Foo(new int[] {1, 2, 3, 4})]
public string Bar() {
  return "Some text";
}

Использование ildasm.exe для просмотра скомпилированного C # (чтобы попытаться понять его путем обратного инжиниринга) дает мне уродливый и непригодный двоичный литерал,Вместо этого я попытался использовать Reflector.NET, и он выглядит намного лучше, но ilasm.exe выдает синтаксическую ошибку по ключевому слову «new», поэтому я не могу его использовать:

.custom instance void SomeNamespace.FooAttribute::.ctor(int32[]) = { new int32[int32(4)] { int32(1), int32(2), int32(3), int32(4) } }

1 Ответ

3 голосов
/ 11 июня 2010

Трудно догадаться, в чем может быть ваша проблема.Если я применяю этот атрибут к методу Program.Test (), я получаю следующее:

  .method private hidebysig static void  Test() cil managed
  {
    .custom instance void ConsoleApplication1.FooAttribute::.ctor(int32[]) = ( 01 00 04 00 00 00 01 00 00 00 02 00 00 00 03 00 
                                                                               00 00 04 00 00 00 00 00 ) 
    // Code size       2 (0x2)
    .maxstack  8
    IL_0000:  nop
    IL_0001:  ret
  } // end of method Program::Test

Запустите это через ilasm.exe, нет проблемОбратите внимание, что значения элементов массива (прокрутите окно фрагмента вправо, чтобы увидеть их) уже преобразованы в формат, необходимый для встраивания их в таблицу данных конструктора атрибутов.BitConverter.GetBytes () может выполнить часть этой работы.Документ Ecma должен иметь требуемый формат этих данных.

...