Partager via


API intrinsèques marquées RequiresDynamicCode

Dans des circonstances normales, l'appel d'API annotées avec RequiresDynamicCodeAttribute dans une application publiée avec un AOT natif déclenche l'avertissement IL3050 (Évitez d'appeler les membres annotés avec “RequiresDynamicCodeAttribute” lors de la publication en tant qu'AOT natif). Les API qui déclenchent l'avertissement peuvent ne pas se comporter correctement après la compilation de l'AOT.

Certaines API annotées RequiresDynamicCode peuvent encore être utilisées sans déclencher l'avertissement lorsqu'elles sont appelées dans un modèle spécifique. Lorsqu'il est utilisé dans le cadre d'un modèle, l'appel à l'API peut être analysé statiquement par le compilateur, ne génère pas d'avertissement et se comporte comme prévu au moment de l'exécution.

Méthode Enum.GetValues(Type)

Les appels à cette API ne déclenchent pas d'avertissement si le type concret de l'enum est statiquement visible dans le corps de la méthode appelante. Par exemple, Enum.GetValues(typeof(AttributeTargets)) ne déclenche pas d'avertissement, mais Enum.GetValues(typeof(T)) et Enum.GetValues(someType) le font.

Méthode Marshal.DestroyStructure(IntPtr, Type)

Les appels à cette API ne déclenchent pas d'avertissement si le type concret est statiquement visible dans le corps de la méthode appelante. Par exemple, Marshal.DestroyStructure(offs, typeof(bool)) ne déclenche pas d'avertissement, mais Marshal.DestroyStructure(offs, typeof(T)) et Marshal.DestroyStructure(offs, someType) le font.

Méthode Marshal.GetDelegateForFunctionPointer(IntPtr, Type)

Les appels à cette API ne déclenchent pas d'avertissement si le type concret est statiquement visible dans le corps de la méthode appelante. Par exemple, Marshal.GetDelegateForFunctionPointer(ptr, typeof(bool)) ne déclenche pas d'avertissement, mais Marshal.GetDelegateForFunctionPointer(ptr, typeof(T)) et Marshal.GetDelegateForFunctionPointer(ptr, someType) le font.

Méthode Marshal.OffsetOf(Type, String)

Les appels à cette API ne déclenchent pas d'avertissement si le type concret est statiquement visible dans le corps de la méthode appelante. Par exemple, Marshal.OffsetOf(typeof(Point), someField) ne déclenche pas d'avertissement, mais Marshal.OffsetOf(typeof(T), someField) et Marshal.OffsetOf(someType, someField) le font.

Méthode Marshal.PtrToStructure(IntPtr, Type)

Les appels à cette API ne déclenchent pas d'avertissement si le type concret est statiquement visible dans le corps de la méthode appelante. Par exemple, Marshal.PtrToStructure(offs, typeof(bool)) ne déclenche pas d'avertissement, mais Marshal.PtrToStructure(offs, typeof(T)) et Marshal.PtrToStructure(offs, someType) le font.

Méthode Marshal.SizeOf(Type)

Les appels à cette API ne déclenchent pas d'avertissement si le type concret est statiquement visible dans le corps de la méthode appelante. Par exemple, Marshal.SizeOf(typeof(bool)) ne déclenche pas d'avertissement, mais Marshal.SizeOf(typeof(T)) et Marshal.SizeOf(someType) le font.

Méthode MethodInfo.MakeGenericMethod(Type[]) (.NET 9+)

Les appels à cette API ne déclenchent pas d'avertissement si la définition de la méthode générique et les arguments d'instanciation sont statiquement visibles dans le corps de la méthode appelante. Par exemple : typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(int)). Il est également possible d'utiliser un paramètre générique comme argument : typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(T)) ne prévient pas non plus.

Si la définition du type générique est statiquement visible dans le corps de la méthode appelante et que tous les paramètres génériques sont contraints d'être une classe, l'appel ne déclenche pas non plus l'avertissement IL3050. Dans ce cas, les arguments ne doivent pas être statiquement visibles. Par exemple :

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

Tous les autres cas, tels que someMethod.MakeGenericMethod(typeof(int)) ou typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(someType) lorsque someType a une valeur inconnue, déclenchent un avertissement.

Méthode Type.MakeGenericType(Type[]) (.NET 9+)

Les appels à cette API ne déclenchent pas d'avertissement si la définition du type générique et les arguments d'instanciation sont statiquement visibles dans le corps de la méthode appelante. Par exemple : typeof(List<>).MakeGenericType(typeof(int)). Il est également possible d'utiliser un paramètre générique comme argument : typeof(List<>).MakeGenericType(typeof(T)) ne prévient pas non plus.

Si la définition du type générique est statiquement visible dans le corps de la méthode appelante et que tous les paramètres génériques sont contraints d'être une classe, l'appel ne déclenche pas non plus l'avertissement IL3050. Dans ce cas, les arguments ne doivent pas être statiquement visibles. Par exemple :

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

Tous les autres cas, tels que someType.MakeGenericType(typeof(int)) ou typeof(List<>).MakeGenericType(someType) lorsque someType a une valeur inconnue, déclenchent un avertissement.