IL ではカスタム属性(Custom Attribute)はどの言語要素に付属するんでしょうか?

powered by Fotopedia

IL のカスタム属性(Custom Attribute) がどの言語要素に付属するかを指定するには次の方法があります
カスタム属性 が書かれた位置による方法、直接付属する要素を指定する方法です

 

●カスタム属性が書かれた位置による方法

その言語要素がスコープを持っていて、カスタム属性がそのスコープ内に書かれたら、そのカスタム属性はそのスコープを持つ要素に付属します
例えば class はスコープを持つので、そのスコープ内に書いたカスタム属性はその class に付属します

.class public MyClass
{
    .custom instance void MyClassAttribute::.ctor()
}

 その要素がスコープを持たないときは、その要素の直後にカスタム属性を指定します
例えば field はスコープを持たないので、field の定義の直後に書いたカスタム属性が field に付属します
これは C# の カスタム属性の指定の仕方と逆です

.class public MyClass
{
    .field int32 MyField
    .custom instance void MyFieldAttribute::.ctor()
}

 

●直接付属する要素を指定する方法

前述のような位置による指定ではどのカスタム属性がどの要素へのものなのか、見た目が煩雑になり読みにくくなることが想像できます
直接付属する要素を指定する方法はそんなときに有効な方法です
指定の仕方は ".custom" の後に "()" でくくって直接付属する要素を指定します

.class public MyClass
{
    .field int32 MyField
    .custom instance void MyFieldAttribute::.ctor()
}
.custom (MyClass) instance void MyClassAttribute::.ctor()

この直接付属する要素を指定する方法は属性がどの要素に付属するか自明になるので、ILソース中のどこにでも記述することができます