次の方法で共有


RequiresDynamicCode とマークされた固有 API

通常の状況では、ネイティブ AOT で公開されたアプリで RequiresDynamicCodeAttribute という注釈が付けられた API を呼び出すと、警告IL3050 (ネイティブ AOT として公開する場合は、'RequiresDynamicCodeAttribute' という注釈が付けられたメンバーを呼び出さないでください) がトリガーされます。 警告のトリガーとなる API は、AOT コンパイル後に正しく動作しない可能性があります。

RequiresDynamicCode という注釈が付けられた API にも、特定のパターン内で呼び出された場合は警告をトリガーせずに使用できるものがあります。 パターンの一部として使用した場合、API の呼び出しはコンパイラによって静的に分析され、警告は生成されず、実行時の動作も想定どおりになります。

Enum.GetValues(Type) メソッド

具象列挙型が呼び出し元のメソッド本体で静的に可視である場合、この API を呼び出しても警告はトリガーされません。 たとえば、Enum.GetValues(typeof(AttributeTargets)) では警告がトリガーされませんが、Enum.GetValues(typeof(T))Enum.GetValues(someType) では警告がトリガーされます。

Marshal.DestroyStructure(IntPtr, Type) メソッド

具象型が呼び出し元のメソッド本体で静的に可視である場合、この API を呼び出しても警告はトリガーされません。 たとえば、Marshal.DestroyStructure(offs, typeof(bool)) では警告がトリガーされませんが、Marshal.DestroyStructure(offs, typeof(T))Marshal.DestroyStructure(offs, someType) では警告がトリガーされます。

Marshal.GetDelegateForFunctionPointer(IntPtr, Type) メソッド

具象型が呼び出し元のメソッド本体で静的に可視である場合、この API を呼び出しても警告はトリガーされません。 たとえば、Marshal.GetDelegateForFunctionPointer(ptr, typeof(bool)) では警告がトリガーされませんが、Marshal.GetDelegateForFunctionPointer(ptr, typeof(T))Marshal.GetDelegateForFunctionPointer(ptr, someType) では警告がトリガーされます。

Marshal.OffsetOf(Type, String) メソッド

具象型が呼び出し元のメソッド本体で静的に可視である場合、この API を呼び出しても警告はトリガーされません。 たとえば、Marshal.OffsetOf(typeof(Point), someField) では警告がトリガーされませんが、Marshal.OffsetOf(typeof(T), someField)Marshal.OffsetOf(someType, someField) では警告がトリガーされます。

Marshal.PtrToStructure(IntPtr, Type) メソッド

具象型が呼び出し元のメソッド本体で静的に可視である場合、この API を呼び出しても警告はトリガーされません。 たとえば、Marshal.PtrToStructure(offs, typeof(bool)) では警告がトリガーされませんが、Marshal.PtrToStructure(offs, typeof(T))Marshal.PtrToStructure(offs, someType) では警告がトリガーされます。

Marshal.SizeOf(Type) メソッド

具象型が呼び出し元のメソッド本体で静的に可視である場合、この API を呼び出しても警告はトリガーされません。 たとえば、Marshal.SizeOf(typeof(bool)) では警告がトリガーされませんが、Marshal.SizeOf(typeof(T))Marshal.SizeOf(someType) では警告がトリガーされます。

MethodInfo.MakeGenericMethod(Type[]) メソッド (.NET 9 以降)

呼び出し側メソッドの本体内で、ジェネリック メソッド定義とインスタンス化引数の両方が静的に可視である場合、この API の呼び出しで警告はトリガーされません。 たとえば、typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(int)) のようにします。 引数としてジェネリック型のパラメーターを使用することもできます: typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(typeof(T)) でも警告されません。

呼び出し元メソッド本体内でジェネリック型定義が静的に可視であり、そのメソッドのすべてのジェネリック型パラメーターがクラスに制限されている場合、この呼び出しでも IL3050 警告がトリガーされません。 この場合、引数を静的に可視である必要はありません。 次に例を示します。

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

someMethod.MakeGenericMethod(typeof(int)) または typeof(SomeType).GetMethod("GenericMethod").MakeGenericMethod(someType)someType が不明な値である場合など、その他のすべてのケースでは警告がトリガーされます。

Type.MakeGenericType(Type[]) メソッド (.NET 9 以降)

呼び出し側メソッドの本体内で、ジェネリック型定義とインスタンス化引数の両方が静的に可視である場合、この API の呼び出しで警告はトリガーされません。 たとえば、typeof(List<>).MakeGenericType(typeof(int)) のようにします。 引数としてジェネリック型のパラメーターを使用することもできます: typeof(List<>).MakeGenericType(typeof(T)) でも警告されません。

呼び出し元メソッド本体内でジェネリック型定義が静的に可視であり、そのメソッドのすべてのジェネリック型パラメーターがクラスに制限されている場合、この呼び出しでも IL3050 警告がトリガーされません。 この場合、引数を静的に可視である必要はありません。 次に例を示します。

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

someType.MakeGenericType(typeof(int)) または typeof(List<>).MakeGenericType(someType)someType が不明な値である場合など、その他のすべてのケースでは警告がトリガーされます。