문서화되어 있지 않지만 .NET 4.5의 최적화 중 하나처럼 보입니다. 리플렉션 유형 정보 캐시를 프라이밍하는 데 사용되어 일반적인 프레임 워크 유형의 후속 리플렉션 코드가 더 빠르게 실행됩니다. System.Reflection.Assembly.cs, 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;
}
더 많은 힌트가 없다면 "축복 된 API"가 무엇을 의미 할 수 있습니다. 컨텍스트에서 이것은 프레임 워크 자체의 유형에서만 작동한다는 것이 분명합니다. 어딘가에 유형과 메소드에 적용된 속성을 확인하는 추가 코드가 있어야합니다. 그것이 어디에 있는지는 모르지만 캐싱을 위해 모든 .NET 유형을 볼 필요가 있다는 점을 감안할 때 Ngen.exe 만 생각할 수 있습니다.