Есть два атрибута, подобных этому:
[AttributeUsage(AttributeTargets.Parameter, Inherited = false, AllowMultiple = true)]
sealed class Test1Attribute : Attribute
{ }
[AttributeUsage(AttributeTargets.Parameter, Inherited = false, AllowMultiple = true)]
sealed class Test2Attribute : Attribute
{ }
Они довольно простые, ничего не делают.
И есть метод, который украшен этими двумя атрибутами:
public void Hello([Test1]string arg, [Test2] string arg2) { }
Теперь, если я скомпилирую код и декомпилирую его с помощью IL Dasm, я увижу, что код IL метода "Hello" выглядит следующим образом:
.method public hidebysig instance void Hello(int32 arg, int32 arg2) cil managed
{
.param [1]
.custom instance void ConsoleApplication1.Test1Attribute::.ctor()
.param [2]
.custom instance void ConsoleApplication1.Test2Attribute::.ctor()
.maxstack 8
L_0000: nop
L_0001: ret
}
Мы видим, что Test1Attribute и Test2Attribute находятся в коде IL.
И его метаданные выглядят так:
MethodName: Hello (06000005)
Flags : [Public] [HideBySig] [ReuseSlot] (00000086)
RVA : 0x0000206b
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
hasThis
ReturnType: Void
2 Arguments
Argument #1: String
Argument #2: String
2 Parameters
(1) ParamToken : (08000002) Name : arg flags: [none] (00000000)
CustomAttribute #1 (0c000010)
-------------------------------------------------------
CustomAttribute Type: 06000001
CustomAttributeName: ConsoleApplication1.Test1Attribute :: instance void .ctor()
Length: 4
Value : 01 00 00 00 > <
ctor args: ()
(2) ParamToken : (08000003) Name : arg2 flags: [none] (00000000)
CustomAttribute #1 (0c000012)
-------------------------------------------------------
CustomAttribute Type: 06000002
CustomAttributeName: ConsoleApplication1.Test2Attribute :: instance void .ctor()
Length: 4
Value : 01 00 00 00 > <
ctor args: ()
Опять же, оба атрибута также присутствуют в Метаданных.
Так что мне интересно:
- Почему они появляются как в IL, так и в метаданных?
Что значит
.param [1]
.custom instance void ConsoleApplication1.Test1Attribute ::. ctor ()
.param [2]
.custom instance void ConsoleApplication1.Test2Attribute ::. ctor ()
означает? Это не похоже на инструкцию. Так что они? Что они делают?
Спасибо