Freigeben über


Systeminterne APIs mit der Anmerkung „RequiresDynamicCode“

Unter normalen Umständen wird durch das Aufrufen von APIs mit der Anmerkung RequiresDynamicCodeAttribute in einer App, die mit nativer AOT-Kompilierung veröffentlicht werden, die Warnung IL3050 (Vermeiden Sie das Aufrufen von Membern, die mit der Anmerkung „RequiresDynamicCodeAttribute“ versehen sind, wenn die Veröffentlichung als native AOT-Bereitstellung erfolgt) ausgelöst. APIs, die die Warnung auslösen, verhalten sich nach der AOT-Kompilierung möglicherweise nicht ordnungsgemäß.

Einige APIs, die mit der Anmerkungen „RequiresDynamicCode“ versehen sind, können weiterhin verwendet werden, ohne die Warnung auszulösen, wenn sie in einem bestimmten Muster aufgerufen werden. Wenn der Aufruf der API als Teil eines Musters verwendet wird, kann der Aufruf der API vom Compiler statisch analysiert werden, generiert keine Warnung und verhält sich zur Laufzeit wie erwartet.

Enum.GetValues(Type)-Methode

Aufrufe dieser API lösen keine Warnungen aus, wenn der konkrete Enumerationstyp im Körper der aufrufenden Methoden statisch sichtbar ist. Enum.GetValues(typeof(AttributeTargets)) löst beispielsweise keine Warnung aus, Enum.GetValues(typeof(T)) und Enum.GetValues(someType) tun es aber.

Marshal.DestroyStructure(IntPtr, Type)-Methode

Aufrufe dieser API lösen keine Warnungen aus, wenn der konkrete Typ im Körper der aufrufenden Methoden statisch sichtbar ist. Marshal.DestroyStructure(offs, typeof(bool)) löst beispielsweise keine Warnung aus, Marshal.DestroyStructure(offs, typeof(T)) und Marshal.DestroyStructure(offs, someType) tun es aber.

Marshal.GetDelegateForFunctionPointer(IntPtr, Type)-Methode

Aufrufe dieser API lösen keine Warnungen aus, wenn der konkrete Typ im Körper der aufrufenden Methoden statisch sichtbar ist. Marshal.GetDelegateForFunctionPointer(ptr, typeof(bool)) löst beispielsweise keine Warnung aus, Marshal.GetDelegateForFunctionPointer(ptr, typeof(T)) und Marshal.GetDelegateForFunctionPointer(ptr, someType) tun es aber.

Marshal.OffsetOf(Type, String)-Methode

Aufrufe dieser API lösen keine Warnungen aus, wenn der konkrete Typ im Körper der aufrufenden Methoden statisch sichtbar ist. Marshal.OffsetOf(typeof(Point), someField) löst beispielsweise keine Warnung aus, Marshal.OffsetOf(typeof(T), someField) und Marshal.OffsetOf(someType, someField) tun es aber.

Marshal.PtrToStructure(IntPtr, Type)-Methode

Aufrufe dieser API lösen keine Warnungen aus, wenn der konkrete Typ im Körper der aufrufenden Methoden statisch sichtbar ist. Marshal.PtrToStructure(offs, typeof(bool)) löst beispielsweise keine Warnung aus, Marshal.PtrToStructure(offs, typeof(T)) und Marshal.PtrToStructure(offs, someType) tun es aber.

Marshal.SizeOf(Type)-Methode

Aufrufe dieser API lösen keine Warnungen aus, wenn der konkrete Typ im Körper der aufrufenden Methoden statisch sichtbar ist. Marshal.SizeOf(typeof(bool)) löst beispielsweise keine Warnung aus, Marshal.SizeOf(typeof(T)) und Marshal.SizeOf(someType) tun es aber.

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

Aufrufe dieser API lösen keine Warnung aus, wenn sowohl die generische Methodendefinition als auch die Instanziierungsargumente im Körper der aufrufenden Methode statisch sichtbar sind. Beispiel: typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(int)). Es ist auch möglich, einen generischen Parameter als Argument zu verwenden: typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(T)) generiert ebenfalls keine Warnungen.

Wenn die generische Typdefinition im Körper der aufrufenden Methode statisch sichtbar ist und alle generischen Parameter auf eine Klasse beschränkt sind, dann löst der Aufruf auch die IL3050-Warnung nicht aus. In diesem Fall dürfen die Argumente statisch nicht sichtbar sein. Zum Beispiel:

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

In allen anderen Fällen, wie z. B. bei someMethod.MakeGenericMethod(typeof(int)) oder typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(someType), wird eine Warnung ausgelöst, wenn someType einen unbekannten Wert aufweist.

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

Aufrufe dieser API lösen keine Warnung aus, wenn sowohl die generische Typdefinition als auch die Instanziierungsargumente im Körper der aufrufenden Methode statisch sichtbar sind. Beispiel: typeof(List<>).MakeGenericType(typeof(int)). Es ist auch möglich, einen generischen Parameter als Argument zu verwenden: typeof(List<>).MakeGenericType(typeof(T)) generiert ebenfalls keine Warnungen.

Wenn die generische Typdefinition im Körper der aufrufenden Methode statisch sichtbar ist und alle generischen Parameter auf eine Klasse beschränkt sind, dann löst der Aufruf auch die IL3050-Warnung nicht aus. In diesem Fall dürfen die Argumente statisch nicht sichtbar sein. Zum Beispiel:

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

In allen anderen Fällen, wie z. B. bei someType.MakeGenericType(typeof(int)) oder typeof(List<>).MakeGenericType(someType), wird eine Warnung ausgelöst, wenn someType einen unbekannten Wert aufweist.