Delen via


Intrinsieke API's gemarkeerd als RequiresDynamicCode

Onder normale omstandigheden worden aanroepen van API's die zijn geannoteerd in RequiresDynamicCodeAttribute een app die is gepubliceerd met systeemeigen AOT-triggers de waarschuwing IL3050 geactiveerd (vermijd het aanroepen van leden die zijn geannoteerd met 'RequiresDynamicCodeAttribute' bij het publiceren als systeemeigen AOT). API's die de waarschuwing activeren, werken mogelijk niet correct na de AOT-compilatie.

Sommige API's met annotatie RequiresDynamicCode kunnen nog steeds worden gebruikt zonder de waarschuwing te activeren wanneer ze in een specifiek patroon worden aangeroepen. Wanneer deze wordt gebruikt als onderdeel van een patroon, kan de aanroep van de API statisch worden geanalyseerd door de compiler, wordt er geen waarschuwing gegenereerd en gedraagt zich zoals verwacht tijdens runtime.

Methode Enum.GetValues(Type)

Aanroepen naar deze API activeren geen waarschuwing als het concrete enumtype statisch zichtbaar is in de hoofdtekst van de aanroepmethode. Activeert bijvoorbeeld Enum.GetValues(typeof(AttributeTargets)) geen waarschuwing, maar Enum.GetValues(typeof(T)) Enum.GetValues(someType) wel.

Methode Marshal.DestroyStructure(IntPtr, Type)

Aanroepen naar deze API activeren geen waarschuwing als het concrete type statisch zichtbaar is in de hoofdtekst van de aanroepmethode. Activeert bijvoorbeeld Marshal.DestroyStructure(offs, typeof(bool)) geen waarschuwing, maar Marshal.DestroyStructure(offs, typeof(T)) Marshal.DestroyStructure(offs, someType) wel.

Methode Marshal.GetDelegateForFunctionPointer(IntPtr, Type)

Aanroepen naar deze API activeren geen waarschuwing als het concrete type statisch zichtbaar is in de hoofdtekst van de aanroepmethode. Activeert bijvoorbeeld Marshal.GetDelegateForFunctionPointer(ptr, typeof(bool)) geen waarschuwing, maar Marshal.GetDelegateForFunctionPointer(ptr, typeof(T)) Marshal.GetDelegateForFunctionPointer(ptr, someType) wel.

Methode Marshal.OffsetOf(Type, String)

Aanroepen naar deze API activeren geen waarschuwing als het concrete type statisch zichtbaar is in de hoofdtekst van de aanroepmethode. Activeert bijvoorbeeld Marshal.OffsetOf(typeof(Point), someField) geen waarschuwing, maar Marshal.OffsetOf(typeof(T), someField) Marshal.OffsetOf(someType, someField) wel.

Methode Marshal.PtrToStructure(IntPtr, Type)

Aanroepen naar deze API activeren geen waarschuwing als het concrete type statisch zichtbaar is in de hoofdtekst van de aanroepmethode. Activeert bijvoorbeeld Marshal.PtrToStructure(offs, typeof(bool)) geen waarschuwing, maar Marshal.PtrToStructure(offs, typeof(T)) Marshal.PtrToStructure(offs, someType) wel.

Methode Marshal.SizeOf(Type)

Aanroepen naar deze API activeren geen waarschuwing als het concrete type statisch zichtbaar is in de hoofdtekst van de aanroepmethode. Activeert bijvoorbeeld Marshal.SizeOf(typeof(bool)) geen waarschuwing, maar Marshal.SizeOf(typeof(T)) Marshal.SizeOf(someType) wel.

Methode MethodInfo.MakeGenericMethod(Type[]) (.NET 9+)

Aanroepen naar deze API activeren geen waarschuwing als zowel de algemene methodedefinitie als de instantiëringsargumenten statisch zichtbaar zijn in de hoofdtekst van de aanroepmethode. Bijvoorbeeld: typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(int)). Het is ook mogelijk om een algemene parameter te gebruiken als argument: typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(T)) waarschuwt ook niet.

Als de algemene typedefinitie statisch zichtbaar is in de hoofdtekst van de aanroepmethode en alle algemene parameters ervan beperkt zijn tot een klasse, activeert de aanroep ook de IL3050-waarschuwing niet. In dit geval hoeven de argumenten niet statisch zichtbaar te zijn. Voorbeeld:

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

Alle andere gevallen, zoals someMethod.MakeGenericMethod(typeof(int)) of typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(someType) waar someType een onbekende waarde is, activeren een waarschuwing.

Methode Type.MakeGenericType(Type[]) (.NET 9+)

Aanroepen naar deze API activeren geen waarschuwing als zowel de algemene typedefinitie als de instantiëringsargumenten statisch zichtbaar zijn in de hoofdtekst van de aanroepmethode. Bijvoorbeeld: typeof(List<>).MakeGenericType(typeof(int)). Het is ook mogelijk om een algemene parameter te gebruiken als argument: typeof(List<>).MakeGenericType(typeof(T)) waarschuwt ook niet.

Als de algemene typedefinitie statisch zichtbaar is in de hoofdtekst van de aanroepmethode en alle algemene parameters ervan beperkt zijn tot een klasse, activeert de aanroep ook de IL3050-waarschuwing niet. In dit geval hoeven de argumenten niet statisch zichtbaar te zijn. Voorbeeld:

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

Alle andere gevallen, zoals someType.MakeGenericType(typeof(int)) of typeof(List<>).MakeGenericType(someType) waar someType een onbekende waarde is, activeren een waarschuwing.