을 통해 찾고 System.Linq.Enumerable
DotPeek I 통지에 몇 가지 방법은 맛되는 [__DynamicallyInvokable]
속성.
이 속성은 어떤 역할을합니까? DotPeek에 의해 추가 된 것이거나 다른 역할을 수행하여 컴파일러에게 방법을 최적화하는 가장 좋은 방법을 알려주는 것일까 요?
답변
문서화되어 있지 않지만 .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 만 생각할 수 있습니다.
답변
Runtime*Info.IsNonW8PFrameworkAPI()
내부 메소드 세트 에서 사용되는 것으로 나타났습니다 . 이 특성을 멤버에 배치하면 IsNonW8PFrameworkAPI ()가이를 반환 false
하여 해당 멤버를 WinRT 응용 프로그램에서 사용할 수있게하고 The API '...' cannot be used on the current platform.
예외를 종료합니다 .
프로파일 러 작성자는 WinRT에서 액세스하려는 경우 프로파일 러가 방출 한 멤버에이 속성을 프레임 워크 어셈블리에 배치해야합니다.