この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

DynamicMethod クラス

 

公開日: 2016年10月

コンパイル、実行、および破棄することのできる動的メソッドを定義し、またそれを表現します。 破棄されたメソッドは、ガベージ コレクションのために利用可能です。

名前空間:   System.Reflection.Emit
アセンブリ:  mscorlib (mscorlib.dll 内)

System.Object
  System.Reflection.MemberInfo
    System.Reflection.MethodBase
      System.Reflection.MethodInfo
        System.Reflection.Emit.DynamicMethod

[ComVisibleAttribute(true)]
public sealed class DynamicMethod : MethodInfo

名前説明
System_CAPS_pubmethodDynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Module, Boolean)

メソッド名、属性、呼び出し規約、戻り値の型、パラメーターの型、モジュールを指定し、さらに Just-In-Time (JIT) 参照範囲チェックが動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーをスキップするかどうかを指定して、動的メソッドを作成します。

System_CAPS_pubmethodDynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type, Boolean)

メソッド名、属性、呼び出し規則、戻り値の型、パラメーターの型、動的メソッドが論理的に関連付けられている型を指定し、さらに Just-In-Time (JIT) 参照範囲チェックが動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーをスキップするかどうかを指定して、動的メソッドを作成します。

System_CAPS_pubmethodDynamicMethod(String, Type, Type[])

メソッド名、戻り値の型、パラメーターの型を指定して、匿名でホストされる動的メソッドを初期化します。

System_CAPS_pubmethodDynamicMethod(String, Type, Type[], Boolean)

メソッド名、戻り値の型、パラメーターの型を指定し、さらに Just-In-Time (JIT) 参照範囲チェックが動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーをスキップするかどうかを指定して、匿名ホスト対象の動的メソッドを初期化します。

System_CAPS_pubmethodDynamicMethod(String, Type, Type[], Module)

モジュールに対してグローバルに適用される動的メソッドを作成し、メソッド名、戻り値の型、パラメーターの型、およびモジュールを指定します。

System_CAPS_pubmethodDynamicMethod(String, Type, Type[], Module, Boolean)

メソッド名、戻り値の型、パラメーターの型、モジュールを指定し、さらに Just-In-Time (JIT) 参照範囲チェックが動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーをスキップするかどうかを指定して、モジュールに対してグローバルな動的メソッドを作成します。

System_CAPS_pubmethodDynamicMethod(String, Type, Type[], Type)

メソッド名、戻り値の型、パラメーターの型、および動的メソッドが論理的に関連付けられる型を指定して、動的メソッドを作成します。

System_CAPS_pubmethodDynamicMethod(String, Type, Type[], Type, Boolean)

メソッド名、戻り値の型、パラメーターの型、動的メソッドが論理的に関連付けられている型を指定し、さらに動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーに対する Just-In-Time (JIT) 参照範囲チェックをスキップするかどうかを指定して、動的メソッドを作成します。

名前説明
System_CAPS_pubpropertyAttributes

動的メソッドの作成時に指定された属性を取得します。(MethodBase.Attributes をオーバーライドします。)

System_CAPS_pubpropertyCallingConvention

動的メソッドの作成時に指定された呼び出し規則を取得します。(MethodBase.CallingConvention をオーバーライドします。)

System_CAPS_pubpropertyContainsGenericParameters

ジェネリック メソッドに未割り当てのジェネリック型パラメーターが含まれるかどうかを示す値を取得します。(MethodBase から継承されます。)

System_CAPS_pubpropertyCustomAttributes

このメンバーのカスタム属性を含むコレクションを取得します。(MemberInfo から継承されます。)

System_CAPS_pubpropertyDeclaringType

メソッドを宣言する型を取得します。動的メソッドの場合は常に null です。(MemberInfo.DeclaringType をオーバーライドします。)

System_CAPS_pubpropertyInitLocals

メソッドのローカル変数をゼロに初期化するかどうかを示す値を取得または設定します。

System_CAPS_pubpropertyIsAbstract

このメソッドが抽象であるかどうかを示す値を取得します。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsAssembly

このメソッドまたはコンス トラクターの潜在的な可視性がで説明されているかどうかを示す値を取得 MethodAttributes.Assembly; は、メソッドまたはコンス トラクターは表示されている多くても、同じアセンブリ内の他の型へとに非表示の派生、アセンブリ外で型です。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsConstructor

メソッドが、コンス トラクターであるかどうかを示す値を取得します。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsFamily

このメソッドまたはコンス トラクターの可視性がで説明されているかどうかを示す値を取得 MethodAttributes.Family;、メソッドまたはコンス トラクターは、クラスと派生クラス内でのみ表示します。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsFamilyAndAssembly

このメソッドまたはコンス トラクターの可視性がで説明されているかどうかを示す値を取得 MethodAttributes.FamANDAssem; は、メソッドまたはコンス トラクターから呼び出せる派生クラスの場合のみ、同じアセンブリ内にある場合。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsFamilyOrAssembly

このメソッドまたはコンス トラクターの潜在的な可視性がで説明されているかどうかを示す値を取得 MethodAttributes.FamORAssem; は、メソッドまたはコンス トラクター呼び出せる派生クラスによって任意の場所であると、同じアセンブリ内のクラスによってです。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsFinal

このメソッドは、あるかどうかを示す値を取得 finalします。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsGenericMethod

このメソッドがジェネリックかどうかを示す値を取得します。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsGenericMethodDefinition

メソッドがジェネリック メソッド定義であるかどうかを示す値を取得します。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsHideBySig

派生クラスで正確に同じシグネチャを持つ同じ種類のメンバーだけが非表示かどうかを示す値を取得します。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsPrivate

このメンバーはプライベートであるかどうかを示す値を取得します。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsPublic

パブリック メソッドであるかどうかを示す値を取得します。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsSecurityCritical

現在の動的メソッドがセキュリティ クリティカルまたはセキュリティ セーフ クリティカルであり、重要な操作を実行できるかどうかを示す値を取得します。(MethodBase.IsSecurityCritical をオーバーライドします。)

System_CAPS_pubpropertyIsSecuritySafeCritical

現在の動的メソッドが現在の信頼レベルでセキュリティ セーフ クリティカルであるかどうか、つまり、重要な操作を実行でき、透過的なコードからアクセスできるかどうかを示す値を取得します。(MethodBase.IsSecuritySafeCritical をオーバーライドします。)

System_CAPS_pubpropertyIsSecurityTransparent

現在の動的メソッドが現在の信頼レベルで透過的であり、重要な操作を実行できないかどうかを示す値を取得します。(MethodBase.IsSecurityTransparent をオーバーライドします。)

System_CAPS_pubpropertyIsSpecialName

このメソッドが、特別な名前を持つかどうかを示す値を取得します。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsStatic

メソッドがあるかどうかを示す値を取得 staticします。(MethodBase から継承されます。)

System_CAPS_pubpropertyIsVirtual

メソッドが virtual であるかどうかを示す値を取得します。(MethodBase から継承されます。)

System_CAPS_pubpropertyMemberType

このメンバーがメソッドであることを示す MemberTypes 値を取得します。(MethodInfo から継承されます。)

System_CAPS_pubpropertyMetadataToken

メタデータ要素を識別する値を取得します。(MemberInfo から継承されます。)

System_CAPS_pubpropertyMethodHandle

動的メソッドはサポートされていません。(MethodBase.MethodHandle をオーバーライドします。)

System_CAPS_pubpropertyMethodImplementationFlags

取得、 MethodImplAttributes メソッドの実装の属性を指定するフラグ。(MethodBase から継承されます。)

System_CAPS_pubpropertyModule

動的メソッドが論理的に関連付けられるモジュールを取得します。(MemberInfo.Module をオーバーライドします。)

System_CAPS_pubpropertyName

動的メソッドの名前を取得します。(MemberInfo.Name をオーバーライドします。)

System_CAPS_pubpropertyReflectedType

メソッドを取得するためにリフレクションで使用されたクラスを取得します。(MemberInfo.ReflectedType をオーバーライドします。)

System_CAPS_pubpropertyReturnParameter

動的メソッドの戻りパラメーターを取得します。(MethodInfo.ReturnParameter をオーバーライドします。)

System_CAPS_pubpropertyReturnType

動的メソッドの戻り値の型を取得します。(MethodInfo.ReturnType をオーバーライドします。)

System_CAPS_pubpropertyReturnTypeCustomAttributes

動的メソッドの戻り値の型のカスタム属性を取得します。(MethodInfo.ReturnTypeCustomAttributes をオーバーライドします。)

名前説明
System_CAPS_pubmethodCreateDelegate(Type)

動的メソッドを完了し、これを実行するために使用できるデリゲートを作成します。(MethodInfo.CreateDelegate(Type) をオーバーライドします。)

System_CAPS_pubmethodCreateDelegate(Type, Object)

動的メソッドを完了し、それを実行するために使用できるデリゲートを作成します。作成する際は、デリゲートの型と、デリゲートをバインドするオブジェクトを指定します。(MethodInfo.CreateDelegate(Type, Object) をオーバーライドします。)

System_CAPS_pubmethodDefineParameter(Int32, ParameterAttributes, String)

動的メソッドのパラメーターを定義します。

System_CAPS_pubmethodEquals(Object)

このインスタンスが、指定されたオブジェクトと等価であるかどうかを示す値を返します。(MethodInfo から継承されます。)

System_CAPS_pubmethodGetBaseDefinition()

メソッドの基本実装を返します。(MethodInfo.GetBaseDefinition() をオーバーライドします。)

System_CAPS_pubmethodGetCustomAttributes(Boolean)

メソッドの定義済みのカスタム属性をすべて返します。(MemberInfo.GetCustomAttributes(Boolean) をオーバーライドします。)

System_CAPS_pubmethodGetCustomAttributes(Type, Boolean)

メソッドに適用されている、指定した型のカスタム属性を返します。(MemberInfo.GetCustomAttributes(Type, Boolean) をオーバーライドします。)

System_CAPS_pubmethodGetCustomAttributesData()

一覧を返す CustomAttributeData 対象のメンバーに適用されている属性に関するデータを表すオブジェクト。(MemberInfo から継承されます。)

System_CAPS_pubmethodGetDynamicILInfo()

メタデータ トークン、スコープ、および Microsoft Intermediate Language (MSIL) ストリームからメソッドの本体を生成するのに使用できる DynamicILInfo オブジェクトを返します。

System_CAPS_pubmethodGetGenericArguments()

ジェネリック メソッドの型引数、またはジェネリック メソッドの定義の型パラメーターを表す Type オブジェクトの配列を返します。(MethodInfo から継承されます。)

System_CAPS_pubmethodGetGenericMethodDefinition()

現在のメソッドを構築する元になるジェネリック メソッド定義を表す MethodInfo オブジェクトを返します。(MethodInfo から継承されます。)

System_CAPS_pubmethodGetHashCode()

このインスタンスのハッシュ コードを返します。(MethodInfo から継承されます。)

System_CAPS_pubmethodGetILGenerator()

メソッドの Microsoft Intermediate Language (MSIL) ジェネレーターを返します。これは 64 バイトの既定の MSIL ストリーム サイズを持ちます。

System_CAPS_pubmethodGetILGenerator(Int32)

指定した Microsoft Intermediate Language (MSIL) ストリーム サイズの、メソッドの MSIL ジェネレーターを返します。

System_CAPS_pubmethodGetMethodBody()

派生クラスでオーバーライドされると、 MethodBody を現在のメソッドの MSIL ストリーム、ローカル変数、および例外へのアクセスを提供するオブジェクト。(MethodBase から継承されます。)

System_CAPS_pubmethodGetMethodImplementationFlags()

このメソッドの実装フラグを返します。(MethodBase.GetMethodImplementationFlags() をオーバーライドします。)

System_CAPS_pubmethodGetParameters()

動的メソッドのパラメーターを返します。(MethodBase.GetParameters() をオーバーライドします。)

System_CAPS_pubmethodGetType()

現在のインスタンスの Type を取得します。(Object から継承されます。)

System_CAPS_pubmethodInvoke(Object, BindingFlags, Binder, Object[], CultureInfo)

指定されたカルチャ情報を使用し、指定したバインダーの制約の下で、指定したパラメーターを使用して動的メソッドを呼び出します。(MethodBase.Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) をオーバーライドします。)

System_CAPS_pubmethodInvoke(Object, Object[])

指定されたパラメーターを使用して、現在のインスタンスが表すメソッドまたはコンストラクターを呼び出します。(MethodBase から継承されます。)

System_CAPS_pubmethodIsDefined(Type, Boolean)

指定されたカスタム属性の型が定義されているかどうかを示します。(MemberInfo.IsDefined(Type, Boolean) をオーバーライドします。)

System_CAPS_pubmethodMakeGenericMethod(Type[])

現在のジェネリック メソッド定義の型パラメーターを型の配列要素に置き換え、その結果構築されるメソッドを表す MethodInfo オブジェクトを返します。(MethodInfo から継承されます。)

System_CAPS_pubmethodToString()

文字列として表される、メソッドの署名を返します。(Object.ToString() をオーバーライドします。)

名前説明
System_CAPS_pubinterfaceSystem_CAPS_privmethod_MemberInfo.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

一連の名前を対応する一連のディスパッチ識別子に割り当てます。(MemberInfo から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MemberInfo.GetType()

取得、 Type を表すオブジェクト、 MemberInfo クラスです。(MemberInfo から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MemberInfo.GetTypeInfo(UInt32, UInt32, IntPtr)

オブジェクトの型情報を取得します。この型情報を使用して、インターフェイスの型情報を取得できます。(MemberInfo から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MemberInfo.GetTypeInfoCount(UInt32)

オブジェクトが提供する型情報インターフェイスの数 (0 または 1) を取得します。(MemberInfo から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MemberInfo.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

オブジェクトによって公開されたプロパティおよびメソッドへのアクセスを提供します。(MemberInfo から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MethodBase.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

一連の名前を対応する一連のディスパッチ識別子に割り当てます。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MethodBase.GetType()

このメンバーの詳細については、「_MethodBase.GetType」を参照してください。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MethodBase.GetTypeInfo(UInt32, UInt32, IntPtr)

オブジェクトの型情報を取得します。この型情報を使用して、インターフェイスの型情報を取得できます。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MethodBase.GetTypeInfoCount(UInt32)

オブジェクトが提供する型情報インターフェイスの数 (0 または 1) を取得します。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MethodBase.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

オブジェクトによって公開されたプロパティおよびメソッドへのアクセスを提供します。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MethodInfo.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

一連の名前を対応する一連のディスパッチ識別子に割り当てます。(MethodInfo から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MethodInfo.GetType()

COM から GetType メソッドにアクセスできるようにします。(MethodInfo から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MethodInfo.GetTypeInfo(UInt32, UInt32, IntPtr)

オブジェクトの型情報を取得します。この情報はインターフェイスの型情報の取得に使用できます。(MethodInfo から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MethodInfo.GetTypeInfoCount(UInt32)

オブジェクトが提供する型情報インターフェイスの数 (0 または 1) を取得します。(MethodInfo から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_MethodInfo.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

オブジェクトによって公開されたプロパティおよびメソッドへのアクセスを提供します。(MethodInfo から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privproperty_MethodBase.IsAbstract

このメンバーの詳細については、「_MethodBase.IsAbstract」を参照してください。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privproperty_MethodBase.IsAssembly

このメンバーの詳細については、「_MethodBase.IsAssembly」を参照してください。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privproperty_MethodBase.IsConstructor

このメンバーの詳細については、「_MethodBase.IsConstructor」を参照してください。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privproperty_MethodBase.IsFamily

このメンバーの詳細については、「_MethodBase.IsFamily」を参照してください。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privproperty_MethodBase.IsFamilyAndAssembly

このメンバーの詳細については、「_MethodBase.IsFamilyAndAssembly」を参照してください。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privproperty_MethodBase.IsFamilyOrAssembly

このメンバーの詳細については、「_MethodBase.IsFamilyOrAssembly」を参照してください。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privproperty_MethodBase.IsFinal

このメンバーの詳細については、「_MethodBase.IsFinal」を参照してください。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privproperty_MethodBase.IsHideBySig

このメンバーの詳細については、「_MethodBase.IsHideBySig」を参照してください。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privproperty_MethodBase.IsPrivate

このメンバーの詳細については、「_MethodBase.IsPrivate」を参照してください。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privproperty_MethodBase.IsPublic

このメンバーの詳細については、「_MethodBase.IsPublic」を参照してください。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privproperty_MethodBase.IsSpecialName

このメンバーの詳細については、「_MethodBase.IsSpecialName」を参照してください。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privproperty_MethodBase.IsStatic

このメンバーの詳細については、「_MethodBase.IsStatic」を参照してください。(MethodBase から継承されます。)

System_CAPS_pubinterfaceSystem_CAPS_privproperty_MethodBase.IsVirtual

このメンバーの詳細については、「_MethodBase.IsVirtual」を参照してください。(MethodBase から継承されます。)

名前説明
System_CAPS_pubmethodGetCustomAttribute(Type)

オーバーロードされます。指定したメンバーに適用されている指定した型のカスタム属性を取得します。(CustomAttributeExtensions によって定義されています。)

System_CAPS_pubmethodGetCustomAttribute(Type, Boolean)

オーバーロードされます。指定したメンバーに適用され、必要に応じてそのメンバーの先祖を調べ、指定した種類のカスタム属性を取得します。(CustomAttributeExtensions によって定義されています。)

System_CAPS_pubmethodGetCustomAttribute<T>()

オーバーロードされます。指定したメンバーに適用されている指定した型のカスタム属性を取得します。(CustomAttributeExtensions によって定義されています。)

System_CAPS_pubmethodGetCustomAttribute<T>(Boolean)

オーバーロードされます。指定したメンバーに適用され、必要に応じてそのメンバーの先祖を調べ、指定した種類のカスタム属性を取得します。(CustomAttributeExtensions によって定義されています。)

System_CAPS_pubmethodGetCustomAttributes()

オーバーロードされます。指定したメンバーに適用されるカスタム属性のコレクションを取得します。(CustomAttributeExtensions によって定義されています。)

System_CAPS_pubmethodGetCustomAttributes(Type)

オーバーロードされます。指定したメンバーに適用されている、指定した型のカスタム属性のコレクションを取得します。(CustomAttributeExtensions によって定義されています。)

System_CAPS_pubmethodGetCustomAttributes<T>(Boolean)

オーバーロードされます。指定されたメンバーに適用されている、指定した型のカスタム属性のコレクションを取得し、必要に応じてそのメンバーの先祖を検査します。(CustomAttributeExtensions によって定義されています。)

System_CAPS_pubmethodGetRuntimeBaseDefinition()

メソッドが最初に宣言された直接または間接基本クラスの指定されたメソッドを表すオブジェクトを取得します。(RuntimeReflectionExtensions によって定義されています。)

System_CAPS_pubmethodIsDefined(Type)

オーバーロードされます。指定されたメンバーに指定した型のカスタム属性を適用するかどうかを示します。(CustomAttributeExtensions によって定義されています。)

You can use the T:System.Reflection.Emit.DynamicMethod class to generate and execute a method at run time, without having to generate a dynamic assembly and a dynamic type to contain the method. The executable code created by the just-in-time (JIT) compiler is reclaimed when the T:System.Reflection.Emit.DynamicMethod object is reclaimed. Dynamic methods are the most efficient way to generate and execute small amounts of code.

A dynamic method can be anonymously hosted, or it can belogically associated with a module or with a type.

  • If the dynamic method is anonymously hosted, it is located in a system-provided assembly, and therefore is isolated from other code. By default, it does not have access to any non-public data. An anonymously hosted dynamic method can have restricted ability to skip the JIT compiler's visibility checks, if it has been granted T:System.Security.Permissions.ReflectionPermission with the F:System.Security.Permissions.ReflectionPermissionFlag.RestrictedMemberAccess flag. The trust level of the assembly whose non-public members are accessed by the dynamic method must be equal to, or a subset of, the trust level of the call stack that emitted the dynamic method. For more information about anonymously hosted dynamic methods, see Walkthrough: Emitting Code in Partial Trust Scenarios.

  • If the dynamic method is associated with a module that you specify, the dynamic method is effectively global to that module. It can access all types in the module and all internal (Friend in Visual Basic) members of the types. You can associate a dynamic method with any module, regardless of whether you created the module, provided that a demand for T:System.Security.Permissions.ReflectionPermission with the F:System.Security.Permissions.ReflectionPermissionFlag.RestrictedMemberAccess flag can be satisfied by the call stack that includes your code. If the F:System.Security.Permissions.ReflectionPermissionFlag.MemberAccess flag is included in the grant, the dynamic method can skip the JIT compiler's visibility checks and access the private data of all types declared in the module or in any other module in any assembly.

    System_CAPS_noteメモ

    When you specify the module with which a dynamic method is associated, that module must not be in the system-provided assembly that is used for anonymous hosting.

  • If the dynamic method is associated with a type that you specify, it has access to all members of the type, regardless of access level. In addition, JIT visibility checks can be skipped. This gives the dynamic method access to the private data of other types declared in the same module or in any other module in any assembly. You can associate a dynamic method with any type, but your code must be granted T:System.Security.Permissions.ReflectionPermission with both the F:System.Security.Permissions.ReflectionPermissionFlag.RestrictedMemberAccess and F:System.Security.Permissions.ReflectionPermissionFlag.MemberAccess flags.

The following table shows which types and members are accessible to an anonymously hosted dynamic method, with and without JIT visibility checks, depending on whether T:System.Security.Permissions.ReflectionPermission with the F:System.Security.Permissions.ReflectionPermissionFlag.RestrictedMemberAccess flag is granted.

 

Without F:System.Security.Permissions.ReflectionPermissionFlag.RestrictedMemberAccess

With F:System.Security.Permissions.ReflectionPermissionFlag.RestrictedMemberAccess

Without skipping JIT visibility checks

Public members of public types in any assembly.

Public members of public types in any assembly.

Skipping JIT visibility checks, with restrictions

Public members of public types in any assembly.

All members of all types, only in assemblies whose trust levels are equal to or less than the trust level of the assembly that emitted the dynamic method.

System_CAPS_noteメモ

Prior to the net_v20sp1_long, emitting code required T:System.Security.Permissions.ReflectionPermission with the F:System.Security.Permissions.ReflectionPermissionFlag.ReflectionEmit flag. This permission is included by default in the FullTrust and LocalIntranet named permission sets, but not in the Internet permission set. Therefore, in earlier versions of the dnprdnshort a library can be used with Internet permissions only if it has the T:System.Security.SecurityCriticalAttribute attribute and also executes an M:System.Security.PermissionSet.Assert for F:System.Security.Permissions.ReflectionPermissionFlag.ReflectionEmit. Such libraries require careful security review because coding errors could result in security holes. The net_v20SP1_short allows code to be emitted in partial trust scenarios without issuing any security demands, because generating code is not inherently a privileged operation. That is, the generated code has no more permissions than the assembly that emits it. This allows libraries that emit code to be security transparent and removes the need to assert F:System.Security.Permissions.ReflectionPermissionFlag.ReflectionEmit, which simplifies the task of writing a secure library. To use this feature, your application should target the net_v35_long or later.

The following table shows which types and members are accessible to a dynamic method that is associated with a module or with a type in a module.

 

Associated with module

Associated with type

Without skipping JIT visibility checks

Public and internal members of public, internal, and private types in the module.

Public members of public types in any assembly.

All members of the associated type. Public and internal members of all the other types in the module.

Public members of public types in any assembly.

Skipping JIT visibility checks

All members of all types in any assembly.

All members of all types in any assembly.

A dynamic method that is associated with a module has the permissions of that module. A dynamic method that is associated with a type has the permissions of the module containing that type.

Dynamic methods and their parameters do not have to be named, but you can specify names to assist in debugging. Custom attributes are not supported on dynamic methods or their parameters.

Although dynamic methods are static methods (Shared methods in Visual Basic), the relaxed rules for delegate binding introduced in the dnprdnlong allow a dynamic method to be bound to an object, so that it acts like an instance method when called using that delegate instance. An example that demonstrates this is provided for the M:System.Reflection.Emit.DynamicMethod.CreateDelegate(System.Type,System.Object) method overload.

System_CAPS_noteメモ

In the dnprdnlong, dynamic methods do not support symbol information, that is, local variable names and line-number mapping. This limitation might be removed in a future version. You can use T:System.Reflection.Emit.AssemblyBuilder during development to simplify debugging the generated Microsoft intermediate language (MSIL), and then switch to dynamic methods during final deployment, because the T:System.Reflection.Emit.ILGenerator calls are the same in both cases.

The following list summarizes the conditions under which dynamic methods can contain unverifiable code. (For example, a dynamic method is unverifiable if its P:System.Reflection.Emit.DynamicMethod.InitLocals property is set to false.)

  • A dynamic method that is associated with a security-critical assembly is also security-critical, and can skip verification. For example, an assembly without security attributes that is run as a desktop application is treated as security-critical by the runtime. If you associate a dynamic method with the assembly, the dynamic method can contain unverifiable code.

  • If a dynamic method that contains unverifiable code is associated with an assembly that has level 1 transparency, the just-in-time (JIT) compiler injects a security demand. The demand succeeds only if the dynamic method is executed by fully trusted code. See Security-Transparent Code, Level 1.

  • If a dynamic method that contains unverifiable code is associated with an assembly that has level 2 transparency (such as mscorlib.dll), it throws an exception (injected by the JIT compiler) instead of making a security demand. See Security-Transparent Code, Level 2.

  • An anonymously hosted dynamic method that contains unverifiable code always throws an exception. It can never skip verification, even if it is created and executed by fully trusted code.

The exception that is thrown for unverifiable code varies depending on the way the dynamic method is invoked. If you invoke a dynamic method by using a delegate returned from the M:System.Reflection.Emit.DynamicMethod.CreateDelegate(System.Type) method, a T:System.Security.VerificationException is thrown. If you invoke the dynamic method by using the Overload:System.Reflection.Emit.DynamicMethod.Invoke method, a T:System.Reflection.TargetInvocationException is thrown with an inner T:System.Security.VerificationException.

The following code example creates a dynamic method that takes two parameters. The example emits a simple function body that prints the first parameter to the console, and the example uses the second parameter as the return value of the method. The example completes the method by creating a delegate, invokes the delegate with different parameters, and finally invokes the dynamic method using the M:System.Reflection.Emit.DynamicMethod.Invoke(System.Object,System.Reflection.BindingFlags,System.Reflection.Binder,System.Object[],System.Globalization.CultureInfo) method.

using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Globalization;

public class Test
{
    // Declare a delegate type that can be used to execute the completed
    // dynamic method. 
    private delegate int HelloDelegate(string msg, int ret);

    public static void Main()
    {
        // Create an array that specifies the types of the parameters
        // of the dynamic method. This dynamic method has a String
        // parameter and an Integer parameter.
        Type[] helloArgs = {typeof(string), typeof(int)};

        // Create a dynamic method with the name "Hello", a return type
        // of Integer, and two parameters whose types are specified by
        // the array helloArgs. Create the method in the module that
        // defines the String class.
        DynamicMethod hello = new DynamicMethod("Hello", 
            typeof(int), 
            helloArgs, 
            typeof(string).Module);

        // Create an array that specifies the parameter types of the
        // overload of Console.WriteLine to be used in Hello.
        Type[] writeStringArgs = {typeof(string)};
        // Get the overload of Console.WriteLine that has one
        // String parameter.
        MethodInfo writeString = typeof(Console).GetMethod("WriteLine", 
            writeStringArgs);

        // Get an ILGenerator and emit a body for the dynamic method,
        // using a stream size larger than the IL that will be
        // emitted.
        ILGenerator il = hello.GetILGenerator(256);
        // Load the first argument, which is a string, onto the stack.
        il.Emit(OpCodes.Ldarg_0);
        // Call the overload of Console.WriteLine that prints a string.
        il.EmitCall(OpCodes.Call, writeString, null);
        // The Hello method returns the value of the second argument;
        // to do this, load the onto the stack and return.
        il.Emit(OpCodes.Ldarg_1);
        il.Emit(OpCodes.Ret);

        // Add parameter information to the dynamic method. (This is not
        // necessary, but can be useful for debugging.) For each parameter,
        // identified by position, supply the parameter attributes and a 
        // parameter name.
        hello.DefineParameter(1, ParameterAttributes.In, "message");
        hello.DefineParameter(2, ParameterAttributes.In, "valueToReturn");

        // Create a delegate that represents the dynamic method. This
        // action completes the method. Any further attempts to
        // change the method are ignored.
        HelloDelegate hi = 
            (HelloDelegate) hello.CreateDelegate(typeof(HelloDelegate));

        // Use the delegate to execute the dynamic method.
        Console.WriteLine("\r\nUse the delegate to execute the dynamic method:");
        int retval = hi("\r\nHello, World!", 42);
        Console.WriteLine("Invoking delegate hi(\"Hello, World!\", 42) returned: " + retval);

        // Execute it again, with different arguments.
        retval = hi("\r\nHi, Mom!", 5280);
        Console.WriteLine("Invoking delegate hi(\"Hi, Mom!\", 5280) returned: " + retval);

        Console.WriteLine("\r\nUse the Invoke method to execute the dynamic method:");
        // Create an array of arguments to use with the Invoke method.
        object[] invokeArgs = {"\r\nHello, World!", 42};
        // Invoke the dynamic method using the arguments. This is much
        // slower than using the delegate, because you must create an
        // array to contain the arguments, and value-type arguments
        // must be boxed.
        object objRet = hello.Invoke(null, BindingFlags.ExactBinding, null, invokeArgs, new CultureInfo("en-us"));
        Console.WriteLine("hello.Invoke returned: " + objRet);

        Console.WriteLine("\r\n ----- Display information about the dynamic method -----");
        // Display MethodAttributes for the dynamic method, set when 
        // the dynamic method was created.
        Console.WriteLine("\r\nMethod Attributes: {0}", hello.Attributes);

        // Display the calling convention of the dynamic method, set when the 
        // dynamic method was created.
        Console.WriteLine("\r\nCalling convention: {0}", hello.CallingConvention);

        // Display the declaring type, which is always null for dynamic
        // methods.
        if (hello.DeclaringType == null)
        {
            Console.WriteLine("\r\nDeclaringType is always null for dynamic methods.");
        }
        else
        {
            Console.WriteLine("DeclaringType: {0}", hello.DeclaringType);
        }

        // Display the default value for InitLocals.
        if (hello.InitLocals)
        {
            Console.Write("\r\nThis method contains verifiable code.");
        }
        else
        {
            Console.Write("\r\nThis method contains unverifiable code.");
        }
        Console.WriteLine(" (InitLocals = {0})", hello.InitLocals);

        // Display the module specified when the dynamic method was created.
        Console.WriteLine("\r\nModule: {0}", hello.Module);

        // Display the name specified when the dynamic method was created.
        // Note that the name can be blank.
        Console.WriteLine("\r\nName: {0}", hello.Name);

        // For dynamic methods, the reflected type is always null.
        if (hello.ReflectedType == null)
        {
            Console.WriteLine("\r\nReflectedType is null.");
        }
        else
        {
            Console.WriteLine("\r\nReflectedType: {0}", hello.ReflectedType);
        }

        if (hello.ReturnParameter == null)
        {
            Console.WriteLine("\r\nMethod has no return parameter.");
        }
        else
        {
            Console.WriteLine("\r\nReturn parameter: {0}", hello.ReturnParameter);
        }

        // If the method has no return type, ReturnType is System.Void.
        Console.WriteLine("\r\nReturn type: {0}", hello.ReturnType);

        // ReturnTypeCustomAttributes returns an ICustomeAttributeProvider
        // that can be used to enumerate the custom attributes of the
        // return value. At present, there is no way to set such custom
        // attributes, so the list is empty.
        if (hello.ReturnType == typeof(void))
        {
            Console.WriteLine("The method has no return type.");
        }
        else
        {
            ICustomAttributeProvider caProvider = hello.ReturnTypeCustomAttributes;
            object[] returnAttributes = caProvider.GetCustomAttributes(true);
            if (returnAttributes.Length == 0)
            {
                Console.WriteLine("\r\nThe return type has no custom attributes.");
            }
            else
            {
                Console.WriteLine("\r\nThe return type has the following custom attributes:");
                foreach( object attr in returnAttributes )
                {
                    Console.WriteLine("\t{0}", attr.ToString());
                }
            }
        }

        Console.WriteLine("\r\nToString: {0}", hello.ToString());

        // Display parameter information.
        ParameterInfo[] parameters = hello.GetParameters();
        Console.WriteLine("\r\nParameters: name, type, ParameterAttributes");
        foreach( ParameterInfo p in parameters )
        {
            Console.WriteLine("\t{0}, {1}, {2}", 
                p.Name, p.ParameterType, p.Attributes);
        }
    }
}

/* This code example produces the following output:

Use the delegate to execute the dynamic method:

Hello, World!
Invoking delegate hi("Hello, World!", 42) returned: 42

Hi, Mom!
Invoking delegate hi("Hi, Mom!", 5280) returned: 5280

Use the Invoke method to execute the dynamic method:

Hello, World!
hello.Invoke returned: 42

 ----- Display information about the dynamic method -----

Method Attributes: PrivateScope, Public, Static

Calling convention: Standard

DeclaringType is always null for dynamic methods.

This method contains verifiable code. (InitLocals = True)

Module: CommonLanguageRuntimeLibrary

Name: Hello

ReflectedType is null.

Method has no return parameter.

Return type: System.Int32

The return type has no custom attributes.

ToString: Int32 Hello(System.String, Int32)

Parameters: name, type, ParameterAttributes
        message, System.String, In
        valueToReturn, System.Int32, In
 */

.NET Framework
2.0 以降で使用可能
ポータブル クラス ライブラリ
サポート対象: 移植可能 .NET プラットフォーム
Silverlight
2.0 以降で使用可能
Windows Phone Silverlight
7.1 以降で使用可能

この型のパブリック static (Visual Basic では Shared ) メンバーはスレッド セーフです。インスタンス メンバーの場合は、スレッド セーフであるとは限りません。

トップに戻る
表示: