有两个属性:
[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反编译,我会看到方法“Hello”的IL代码是这样的:
.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: ()
同样,元数据中也存在这两个属性。
所以我很好奇:
是什么
.param [1] .custom instance void ConsoleApplication1.Test1Attribute ::。ctor() .param [2] .custom instance void ConsoleApplication1.Test2Attribute ::。ctor()
意思?它看起来不像是指令。那他们是什么?他们做了什么?
由于
答案 0 :(得分:4)
属性只是一个类,请注意您使用类关键字来声明一个。每个类都有一个构造函数,即使你自己也不写。构造函数方法的名称是.ctor()。显然,使用任何方法都可以获得方法体中代码的IL。
方法的参数有自己的元数据。这里用于描述应用的属性。 .param指令给出参数号,.custom指令给出关联的属性。这是IL语法中的注释,它实际上并不存在于IL方法中。
元数据结构很复杂,有很多表,反汇编程序重写它以使其更全面。 Ecma 335拥有您需要的一切,如果您想了解它的真实含义。
答案 1 :(得分:4)
自定义属性是可以附加到任何元数据的数据片段。如果您想了解完整的详细信息,请让ECMS 335 Spec具有基础知识。第242页包含有关CustomAttribute元数据表的信息,用于存储属性数据的序列化格式在第295页(所有页码都在实际的pdf文件页面中)。
您的问题的答案:
两个人: 一个。您正在查看上述元数据的2个视图(1.带有方法(和参数)元数据的IL和2.详细的元数据视图 - 减去IL) 湾ILDasm向您显示执行所需的方法部分。您可能认为奇怪的是方法签名不包含属性 - 这是因为方法签名只是参数类型。附加到参数的任何属性只是附加到参数而不是签名...所以ILDasm也会向您显示这些属性 - 但低于签名。
这些是存储并附加到参数的属性的反序列化和连接元数据。在您的情况下,它只是对默认构造函数的调用,但在更复杂的情况下,您将调用构造函数和数据参数,这些参数也存储在序列化位中。