Vestavěná API označená jako RequiresDynamicCode

Za normálních okolností volání rozhraní API anotovaných RequiresDynamicCodeAttribute v aplikaci publikované s nativním AOT vyvolá upozornění IL3050 (Vyhněte se volání členů anotovaných pomocí 'RequiresDynamicCodeAttribute' při publikování jako nativní AOT). Rozhraní API, která aktivují upozornění, se nemusí po kompilaci AOT chovat správně.

Některá rozhraní API opatřená poznámkami RequiresDynamicCode se stále dají použít bez aktivace upozornění při zavolání v určitém vzoru. Při použití v rámci vzoru může být volání rozhraní API staticky analyzováno kompilátorem, negeneruje upozornění a chová se podle očekávání za běhu.

Metoda Enum.GetValues(Type)

Volání této API nevyvolá upozornění, pokud je konkrétní výčet staticky viditelný v těle volající metody. Například Enum.GetValues(typeof(AttributeTargets)) neaktivuje upozornění, ale Enum.GetValues(typeof(T)) provede a Enum.GetValues(someType) provede.

Marshal.DestroyStructure(IntPtr, Type) – metoda

Volání tohoto rozhraní API neaktivují upozornění, pokud je konkrétní typ staticky viditelný v těle volající metody. Například Marshal.DestroyStructure(offs, typeof(bool)) neaktivuje upozornění, ale Marshal.DestroyStructure(offs, typeof(T)) provede a Marshal.DestroyStructure(offs, someType) provede.

Marshal.GetDelegateForFunctionPointer(IntPtr, Type) – metoda

Volání tohoto rozhraní API neaktivují upozornění, pokud je konkrétní typ staticky viditelný v těle volající metody. Například Marshal.GetDelegateForFunctionPointer(ptr, typeof(bool)) neaktivuje upozornění, ale Marshal.GetDelegateForFunctionPointer(ptr, typeof(T)) provede a Marshal.GetDelegateForFunctionPointer(ptr, someType) provede.

Metoda "Marshal.OffsetOf(Type, String)"

Volání tohoto rozhraní API neaktivují upozornění, pokud je konkrétní typ staticky viditelný v těle volající metody. Například Marshal.OffsetOf(typeof(Point), someField) neaktivuje upozornění, ale Marshal.OffsetOf(typeof(T), someField) provede a Marshal.OffsetOf(someType, someField) provede.

Marshal.PtrToStructure(IntPtr, Type) – metoda

Volání tohoto rozhraní API neaktivují upozornění, pokud je konkrétní typ staticky viditelný v těle volající metody. Například Marshal.PtrToStructure(offs, typeof(bool)) neaktivuje upozornění, ale Marshal.PtrToStructure(offs, typeof(T)) provede a Marshal.PtrToStructure(offs, someType) provede.

Metoda Marshal.SizeOf(Type)

Volání tohoto rozhraní API neaktivují upozornění, pokud je konkrétní typ staticky viditelný v těle volající metody. Například Marshal.SizeOf(typeof(bool)) neaktivuje upozornění, ale Marshal.SizeOf(typeof(T)) provede a Marshal.SizeOf(someType) provede.

MethodInfo.MakeGenericMethod(Type[]) – metoda (.NET 9+)

Volání tohoto rozhraní API neaktivují upozornění, pokud jsou v těle volající metody staticky viditelné jak definice obecné metody, tak argumenty vytváření instancí. Například typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(int)). Jako argument je možné použít také obecný parametr: typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(T)), a také se nezobrazí žádné upozornění.

Pokud je definice obecného typu staticky viditelná v těle volající metody a všechny obecné parametry jsou omezeny na třídu, volání také neaktivuje upozornění IL3050. V tomto případě nemusí být argumenty staticky viditelné. Příklad:

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

Všechny ostatní případy, jako například someMethod.MakeGenericMethod(typeof(int)) nebo typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(someType), kde someType má neznámou hodnotu, aktivují upozornění.

Type.MakeGenericType(Type[]) – metoda (.NET 9+)

Volání tohoto rozhraní API neaktivují upozornění, pokud jsou v těle volající metody staticky viditelné jak definice obecného typu, tak argumenty vytváření instancí. Například typeof(List<>).MakeGenericType(typeof(int)). Jako argument je také možné použít obecný parametr: typeof(List<>).MakeGenericType(typeof(T)) také se upozornění nezobrazí.

Pokud je definice obecného typu staticky viditelná v těle volající metody a všechny obecné parametry jsou omezeny na třídu, volání také neaktivuje upozornění IL3050. V tomto případě nemusí být argumenty staticky viditelné. Příklad:

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

Všechny ostatní případy, jako je someType.MakeGenericType(typeof(int)) nebo typeof(List<>).MakeGenericType(someType) nebo someType, kdy mají neznámou hodnotu, aktivují upozornění.