Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In circostanze normali, la chiamata di API annotate con RequiresDynamicCodeAttribute in un'app pubblicata con AOT nativo attiva l'avviso IL3050 (evitare di chiamare i membri annotati con 'RequiresDynamicCodeAttribute' durante la pubblicazione come AOT nativo). Le API che attivano l'avviso potrebbero non comportarsi correttamente dopo la compilazione AOT.
È comunque possibile usare alcune API con annotazioni RequiresDynamicCode senza attivare l'avviso quando viene chiamato in un modello specifico. Se usato come parte di un modello, la chiamata all'API può essere analizzata in modo statico dal compilatore, non genera un avviso e si comporta come previsto in fase di esecuzione.
Metodo Enum.GetValues(Type)
Le chiamate a questa API non attivano un avviso se il tipo di enumerazione concreta è visibile in modo statico nel corpo del metodo chiamante. Ad esempio, Enum.GetValues(typeof(AttributeTargets)) non attiva un avviso, ma Enum.GetValues(typeof(T)) e Enum.GetValues(someType) lo fa.
Metodo Marshal.DestroyStructure(IntPtr, Type)
Le chiamate a questa API non attivano un avviso se il tipo concreto è visibile in modo statico nel corpo del metodo chiamante. Ad esempio, Marshal.DestroyStructure(offs, typeof(bool)) non attiva un avviso, ma Marshal.DestroyStructure(offs, typeof(T)) e Marshal.DestroyStructure(offs, someType) lo fa.
Metodo Marshal.GetDelegateForFunctionPointer(IntPtr, Type)
Le chiamate a questa API non attivano un avviso se il tipo concreto è visibile in modo statico nel corpo del metodo chiamante. Ad esempio, Marshal.GetDelegateForFunctionPointer(ptr, typeof(bool)) non attiva un avviso, ma Marshal.GetDelegateForFunctionPointer(ptr, typeof(T)) e Marshal.GetDelegateForFunctionPointer(ptr, someType) lo fa.
Metodo Marshal.OffsetOf(Type, String)
Le chiamate a questa API non attivano un avviso se il tipo concreto è visibile in modo statico nel corpo del metodo chiamante. Ad esempio, Marshal.OffsetOf(typeof(Point), someField) non attiva un avviso, ma Marshal.OffsetOf(typeof(T), someField) e Marshal.OffsetOf(someType, someField) lo fa.
Metodo Marshal.PtrToStructure(IntPtr, Type)
Le chiamate a questa API non attivano un avviso se il tipo concreto è visibile in modo statico nel corpo del metodo chiamante. Ad esempio, Marshal.PtrToStructure(offs, typeof(bool)) non attiva un avviso, ma Marshal.PtrToStructure(offs, typeof(T)) e Marshal.PtrToStructure(offs, someType) lo fa.
Metodo Marshal.SizeOf(Type)
Le chiamate a questa API non attivano un avviso se il tipo concreto è visibile in modo statico nel corpo del metodo chiamante. Ad esempio, Marshal.SizeOf(typeof(bool)) non attiva un avviso, ma Marshal.SizeOf(typeof(T)) e Marshal.SizeOf(someType) lo fa.
Metodo MethodInfo.MakeGenericMethod(Type[]) (.NET 9+)
Le chiamate a questa API non attivano un avviso se sia la definizione del metodo generico che gli argomenti di creazione di istanze sono visibili in modo statico all'interno del corpo del metodo chiamante. Ad esempio: typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(int)). È anche possibile usare un parametro generico come argomento: typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(T)) non avvisa anche.
Se la definizione di tipo generico è visibile in modo statico all'interno del corpo del metodo chiamante e tutti i parametri generici di esso sono vincolati a una classe, la chiamata non attiva anche l'avviso IL3050. In questo caso, gli argomenti non devono essere visibili in modo statico. Ad esempio:
// 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 { }
}
Tutti gli altri casi, ad esempio someMethod.MakeGenericMethod(typeof(int)) o typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(someType) dove someType ha un valore sconosciuto, attivano un avviso.
Metodo Type.MakeGenericType(Type[]) (.NET 9+)
Le chiamate a questa API non attivano un avviso se sia la definizione del tipo generico che gli argomenti di creazione di istanze sono visibili in modo statico all'interno del corpo del metodo chiamante. Ad esempio: typeof(List<>).MakeGenericType(typeof(int)). È anche possibile usare un parametro generico come argomento: typeof(List<>).MakeGenericType(typeof(T)) non avvisa anche.
Se la definizione di tipo generico è visibile in modo statico all'interno del corpo del metodo chiamante e tutti i parametri generici di esso sono vincolati a una classe, la chiamata non attiva anche l'avviso IL3050. In questo caso, gli argomenti non devono essere visibili in modo statico. Ad esempio:
// 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 { }
Tutti gli altri casi, ad esempio someType.MakeGenericType(typeof(int)) o typeof(List<>).MakeGenericType(someType) dove someType ha un valore sconosciuto, attivano un avviso.