Itu tidak berdokumen, tetapi sepertinya salah satu optimasi di .NET 4.5. Tampaknya digunakan untuk mengunggah cache info tipe refleksi, membuat kode refleksi berikutnya pada tipe framework umum berjalan lebih cepat. Ada komentar tentang hal itu di Sumber Referensi untuk System.Reflection.Assembly.cs, properti RuntimeAssembly.Flags:
// Each blessed API will be annotated with a "__DynamicallyInvokableAttribute".
// This "__DynamicallyInvokableAttribute" is a type defined in its own assembly.
// So the ctor is always a MethodDef and the type a TypeDef.
// We cache this ctor MethodDef token for faster custom attribute lookup.
// If this attribute type doesn't exist in the assembly, it means the assembly
// doesn't contain any blessed APIs.
Type invocableAttribute = GetType("__DynamicallyInvokableAttribute", false);
if (invocableAttribute != null)
{
Contract.Assert(((MetadataToken)invocableAttribute.MetadataToken).IsTypeDef);
ConstructorInfo ctor = invocableAttribute.GetConstructor(Type.EmptyTypes);
Contract.Assert(ctor != null);
int token = ctor.MetadataToken;
Contract.Assert(((MetadataToken)token).IsMethodDef);
flags |= (ASSEMBLY_FLAGS)token & ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_TOKEN_MASK;
}
Tanpa petunjuk lebih lanjut apa arti "API yang diberkati". Meskipun jelas dari konteksnya bahwa ini hanya akan bekerja pada tipe dalam kerangka itu sendiri. Seharusnya ada kode tambahan di suatu tempat yang memeriksa atribut yang diterapkan pada jenis dan metode. Tidak tahu di mana itu berada, tetapi mengingat bahwa itu harus perlu memiliki pandangan dari semua jenis .NET untuk mencoba caching, saya hanya bisa memikirkan Ngen.exe.