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.