일반적인 상황에서는 네이티브 AOT로 게시된 앱에서 RequiresDynamicCodeAttribute 주석이 추가된 API를 호출하면 경고 IL3050이 트리거됩니다(네이티브 AOT로 게시할 때 'RequiresDynamicCodeAttribute'로 주석이 추가된 멤버를 호출하지 않을 것). 경고를 트리거하는 API는 AOT 컴파일 후에 올바르게 작동하지 않을 수 있습니다.
특정 패턴에서 호출될 때 경고를 트리거하지 않고 RequiresDynamicCode에 주석이 추가된 일부 API를 계속 사용할 수 있습니다. 패턴의 일부로 사용되는 경우 API 호출은 컴파일러에서 정적으로 분석할 수 있으며 경고를 생성하지 않으며 런타임에 예상대로 동작합니다.
Enum.GetValues(Type) 메서드
구체적인 열거형 형식이 호출 메서드 본문에 정적으로 표시되는 경우 이 API에 대한 호출은 경고를 트리거하지 않습니다. 예를 들어 Enum.GetValues(typeof(AttributeTargets))은(는) 경고를 트리거하지 않지만 Enum.GetValues(typeof(T)) 및 Enum.GetValues(someType)은(는) 트리거합니다.
Marshal.DestroyStructure(IntPtr, Type) 메서드
구체적인 형식이 호출 메서드 본문에 정적으로 표시되는 경우 이 API에 대한 호출은 경고를 트리거하지 않습니다. 예를 들어 Marshal.DestroyStructure(offs, typeof(bool))은(는) 경고를 트리거하지 않지만 Marshal.DestroyStructure(offs, typeof(T)) 및 Marshal.DestroyStructure(offs, someType)은(는) 트리거합니다.
Marshal.GetDelegateForFunctionPointer(IntPtr, Type) 메서드
구체적인 형식이 호출 메서드 본문에 정적으로 표시되는 경우 이 API에 대한 호출은 경고를 트리거하지 않습니다. 예를 들어 Marshal.GetDelegateForFunctionPointer(ptr, typeof(bool))은(는) 경고를 트리거하지 않지만 Marshal.GetDelegateForFunctionPointer(ptr, typeof(T)) 및 Marshal.GetDelegateForFunctionPointer(ptr, someType)은(는) 트리거합니다.
Marshal.OffsetOf(Type, String) 메서드
구체적인 형식이 호출 메서드 본문에 정적으로 표시되는 경우 이 API에 대한 호출은 경고를 트리거하지 않습니다. 예를 들어 Marshal.OffsetOf(typeof(Point), someField)은(는) 경고를 트리거하지 않지만 Marshal.OffsetOf(typeof(T), someField) 및 Marshal.OffsetOf(someType, someField)은(는) 트리거합니다.
Marshal.PtrToStructure(IntPtr, Type) 메서드
구체적인 형식이 호출 메서드 본문에 정적으로 표시되는 경우 이 API에 대한 호출은 경고를 트리거하지 않습니다. 예를 들어 Marshal.PtrToStructure(offs, typeof(bool))은(는) 경고를 트리거하지 않지만 Marshal.PtrToStructure(offs, typeof(T)) 및 Marshal.PtrToStructure(offs, someType)은(는) 트리거합니다.
Marshal.SizeOf(Type) 메서드
구체적인 형식이 호출 메서드 본문에 정적으로 표시되는 경우 이 API에 대한 호출은 경고를 트리거하지 않습니다. 예를 들어 Marshal.SizeOf(typeof(bool))은(는) 경고를 트리거하지 않지만 Marshal.SizeOf(typeof(T)) 및 Marshal.SizeOf(someType)은(는) 트리거합니다.
MethodInfo.MakeGenericMethod(Type[]) 메서드(.NET 9+)
제네릭 메서드 정의와 인스턴스화 인수가 호출 메서드 본문 내에서 정적으로 표시되는 경우 이 API에 대한 호출은 경고를 트리거하지 않습니다. 예들 들어 typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(int))입니다. 제네릭 매개 변수를 인수로 사용할 수도 있습니다. typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(T))도 경고하지 않습니다.
제네릭 형식 정의가 호출 메서드 본문 내에 정적으로 표시되고 제네릭의 모든 제네릭 매개 변수가 클래스로 제한되는 경우 호출은 IL3050 경고를 트리거하지 않습니다. 이 경우 인수를 정적으로 표시할 필요가 없습니다. 예시:
// No IL3050 warning on MakeGenericMethod because T is constrained to be class
typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(Type.GetType(Console.ReadLine()));
class SomeType
{
public void GenericMethod<T>() where T : class { }
}
다른 모든 경우, 즉 someMethod.MakeGenericMethod(typeof(int)) 또는 typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(someType) 등 someType이(가) 알 수 없는 값인 경우 경고를 트리거합니다.
Type.MakeGenericType(Type[]) 메서드 (.NET 9+)
제네릭 형식 정의와 인스턴스화 인수가 호출 메서드 본문 내에서 정적으로 표시되는 경우 이 API에 대한 호출은 경고를 트리거하지 않습니다. 예들 들어 typeof(List<>).MakeGenericType(typeof(int))입니다. 제네릭 매개 변수를 인수로 사용할 수도 있습니다. typeof(List<>).MakeGenericType(typeof(T))도 경고하지 않습니다.
제네릭 형식 정의가 호출 메서드 본문 내에 정적으로 표시되고 제네릭의 모든 제네릭 매개 변수가 클래스로 제한되는 경우 호출은 IL3050 경고를 트리거하지 않습니다. 이 경우 인수를 정적으로 표시할 필요가 없습니다. 예시:
// No IL3050 warning on MakeGenericType because T is constrained to be class
typeof(Generic<>).MakeGenericType(Type.GetType(Console.ReadLine()));
class Generic<T> where T : class { }
다른 모든 경우, 즉 someType.MakeGenericType(typeof(int)) 또는 typeof(List<>).MakeGenericType(someType) 등 someType이(가) 알 수 없는 값인 경우 경고를 트리거합니다.
.NET