RequiresDynamicCode olarak işaretlenmiş iç API'ler

Normal koşullarda, native AOT ile yayımlanan bir uygulamada RequiresDynamicCodeAttribute ile işaretlenmiş API'lerin çağrılması IL3050 uyarısını tetikler (native AOT olarak yayımlarken 'RequiresDynamicCodeAttribute' ile işaretlenmiş üyeleri çağırmaktan kaçının). Uyarıyı tetikleyen API'ler AOT derlemesi sonrasında düzgün çalışmayabilir.

RequiresDynamicCode açıklaması olan bazı API'ler, belirli bir şablonla çağrıldığında uyarı tetiklenmeden kullanılabilir. Bir desenin parçası olarak kullanıldığında, API çağrısı derleyici tarafından statik olarak çözümlenebilir, uyarı oluşturmaz ve çalışma zamanında beklendiği gibi davranır.

Enum.GetValues(Type) Yöntemi

Bu API'ye yapılan çağrılar, somut sabit listesi türü çağıran yöntemin gövdesinde statik olarak görünür durumdaysa bir uyarı tetiklemez. Örneğin, Enum.GetValues(typeof(AttributeTargets)) bir uyarı tetiklemez ve Enum.GetValues(typeof(T))Enum.GetValues(someType) tetikler.

Marshal.DestroyStructure(IntPtr, Type) Yöntemi

Bu API'ye yapılan çağrılar, somut tür çağrı yapılan metodun gövdesinde statik olarak görünür durumdaysa bir uyarı tetiklemez. Örneğin, Marshal.DestroyStructure(offs, typeof(bool)) bir uyarı tetiklemez ve Marshal.DestroyStructure(offs, typeof(T))Marshal.DestroyStructure(offs, someType) tetikler.

Marshal.GetDelegateForFunctionPointer(IntPtr, Type) Yöntemi

Bu API'ye yapılan çağrılar, beton türü çağırma yöntemi gövdesinde statik olarak görünür durumdaysa bir uyarı tetiklemez. Örneğin, Marshal.GetDelegateForFunctionPointer(ptr, typeof(bool)) bir uyarı tetiklemez ve Marshal.GetDelegateForFunctionPointer(ptr, typeof(T))Marshal.GetDelegateForFunctionPointer(ptr, someType) tetikler.

Marshal.OffsetOf Yöntemi

Bu API'ye yapılan çağrılar, somut tür çağıran yöntemin gövdesinde statik olarak görünür durumdaysa bir uyarı tetiklemez. Örneğin, Marshal.OffsetOf(typeof(Point), someField) bir uyarı tetiklemez ve Marshal.OffsetOf(typeof(T), someField)Marshal.OffsetOf(someType, someField) tetikler.

Marshal.PtrToStructure(IntPtr, Type) Yöntemi

Bu API'ye yapılan çağrılar, beton türü çağırma yöntemi gövdesinde statik olarak görünür durumdaysa bir uyarı tetiklemez. Örneğin, Marshal.PtrToStructure(offs, typeof(bool)) bir uyarı tetiklemez ve Marshal.PtrToStructure(offs, typeof(T))Marshal.PtrToStructure(offs, someType) tetikler.

Marshal.SizeOf(Type) Yöntemi

Bu API'ye yapılan çağrılar, somut tür çağrı yapan yöntem gövdesinde statik olarak görünür durumdaysa bir uyarı tetiklemez. Örneğin, Marshal.SizeOf(typeof(bool)) bir uyarı tetiklemez ve Marshal.SizeOf(typeof(T))Marshal.SizeOf(someType) tetikler.

MethodInfo.MakeGenericMethod(Type[]) Yöntemi (.NET 9+)

Hem genel yöntem tanımı hem de örnekleme bağımsız değişkenleri çağrı yöntemi gövdesinde statik olarak görünür durumdaysa, bu API'ye yapılan çağrılar bir uyarı tetiklemez. Örneğin, typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(int)). Bağımsız değişken olarak genel bir parametre kullanmak da mümkündür: typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(T)) ayrıca uyarmaz.

Genel tür tanımı çağırma yöntemi gövdesinde statik olarak görünüyorsa ve tüm genel parametreleri bir sınıf olacak şekilde kısıtlanmışsa, çağrı IL3050 uyarısını da tetiklemez. Bu durumda bağımsız değişkenlerin statik olarak görünür olması gerekmez. Örneğin:

// 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)) veya typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(someType) gibi, someType bilinmeyen bir değere sahip olan tüm diğer durumlar bir uyarıyı tetikler.

Type.MakeGenericType(Type[]) Yöntemi (.NET 9+)

Hem genel tür tanımı hem de örnekleme bağımsız değişkenleri çağrı yöntemi gövdesinde statik olarak görünür durumdaysa, bu API'ye yapılan çağrılar bir uyarı tetiklemez. Örneğin, typeof(List<>).MakeGenericType(typeof(int)). Bağımsız değişken olarak genel bir parametre kullanmak da mümkündür: typeof(List<>).MakeGenericType(typeof(T)) ayrıca uyarmaz.

Genel tür tanımı çağırma yöntemi gövdesinde statik olarak görünüyorsa ve tüm genel parametreleri bir sınıf olacak şekilde kısıtlanmışsa, çağrı IL3050 uyarısını da tetiklemez. Bu durumda, bağımsız değişkenlerin statik olarak görünür durumda olması gerekmez. Örneğin:

// 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 { }

Diğer tüm durumlar, someType.MakeGenericType(typeof(int)) veya typeof(List<>).MakeGenericType(someType) gibi ve someType'nin bilinmeyen bir değere sahip olduğu durumlar, bir uyarı tetikler.