Dela via


Inbyggda API:er markerade med RequiresDynamicCode

Under normala omständigheter anropar API:er som kommenterats med RequiresDynamicCodeAttribute i en app som publicerats med interna AOT-utlösare varning IL3050 (Undvik att anropa medlemmar som kommenterats med "RequiresDynamicCodeAttribute" när du publicerar som intern AOT). API:er som utlöser varningen kanske inte fungerar korrekt efter AOT-kompilering.

Vissa API:er som kommenterats KräverDynamicCode kan fortfarande användas utan att utlösa varningen när den anropas i ett specifikt mönster. När det används som en del av ett mönster kan anropet till API:et analyseras statiskt av kompilatorn, genererar ingen varning och fungerar som förväntat vid körning.

Enum.GetValues(Type)-metod

Anrop till det här API:et utlöser ingen varning om den konkreta uppräkningstypen är statiskt synlig i anropsmetodens brödtext. Till exempel Enum.GetValues(typeof(AttributeTargets)) utlöser inte en varning, men Enum.GetValues(typeof(T)) och Enum.GetValues(someType) gör det.

Marshal.DestroyStructure(IntPtr, Type) -metod

Anrop till det här API:et utlöser ingen varning om den konkreta typen är statiskt synlig i anropsmetodens brödtext. Till exempel Marshal.DestroyStructure(offs, typeof(bool)) utlöser inte en varning, men Marshal.DestroyStructure(offs, typeof(T)) och Marshal.DestroyStructure(offs, someType) gör det.

Marshal.GetDelegateForFunctionPointer(IntPtr, Type) -metod

Anrop till det här API:et utlöser ingen varning om den konkreta typen är statiskt synlig i anropsmetodens brödtext. Till exempel Marshal.GetDelegateForFunctionPointer(ptr, typeof(bool)) utlöser inte en varning, men Marshal.GetDelegateForFunctionPointer(ptr, typeof(T)) och Marshal.GetDelegateForFunctionPointer(ptr, someType) gör det.

Marshal.OffsetOf(type, string) -metod

Anrop till det här API:et utlöser ingen varning om den konkreta typen är statiskt synlig i anropsmetodens brödtext. Till exempel Marshal.OffsetOf(typeof(Point), someField) utlöser inte en varning, men Marshal.OffsetOf(typeof(T), someField) och Marshal.OffsetOf(someType, someField) gör det.

Marshal.PtrToStructure(IntPtr, Type) -metod

Anrop till det här API:et utlöser ingen varning om den konkreta typen är statiskt synlig i anropsmetodens brödtext. Till exempel Marshal.PtrToStructure(offs, typeof(bool)) utlöser inte en varning, men Marshal.PtrToStructure(offs, typeof(T)) och Marshal.PtrToStructure(offs, someType) gör det.

Marshal.SizeOf(Type)-metod

Anrop till det här API:et utlöser ingen varning om den konkreta typen är statiskt synlig i anropsmetodens brödtext. Till exempel Marshal.SizeOf(typeof(bool)) utlöser inte en varning, men Marshal.SizeOf(typeof(T)) och Marshal.SizeOf(someType) gör det.

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

Anrop till det här API:et utlöser ingen varning om både den generiska metoddefinitionen och instansieringsargumenten är statiskt synliga i anropande metodtext. Exempel: typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(int)) Det går också att använda en allmän parameter som argument: typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(T)) varnar inte heller.

Om den generiska typdefinitionen är statiskt synlig i anropande metodtext och alla generiska parametrar i den är begränsade till en klass utlöser anropet inte heller IL3050-varningen. I det här fallet behöver argumenten inte vara statiskt synliga. Till exempel:

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

Alla andra fall, till exempel someMethod.MakeGenericMethod(typeof(int)) eller typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(someType) där someType har ett okänt värde, utlöser en varning.

Type.MakeGenericType(Type[]) -metoden (.NET 9+)

Anrop till det här API:et utlöser ingen varning om både den generiska typdefinitionen och instansieringsargumenten är statiskt synliga i den anropande metodens brödtext. Exempel: typeof(List<>).MakeGenericType(typeof(int)) Det går också att använda en allmän parameter som argument: typeof(List<>).MakeGenericType(typeof(T)) varnar inte heller.

Om den generiska typdefinitionen är statiskt synlig i anropande metodtext och alla generiska parametrar i den är begränsade till en klass utlöser anropet inte heller IL3050-varningen. I det här fallet behöver argumenten inte vara statiskt synliga. Till exempel:

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

Alla andra fall, till exempel someType.MakeGenericType(typeof(int)) eller typeof(List<>).MakeGenericType(someType) där someType har ett okänt värde, utlöser en varning.