次の方法で共有


システム。リフレクトion。Emit.DynamicMethod クラス

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

このクラスを DynamicMethod 使用すると、動的アセンブリと動的な型を生成してメソッドを格納しなくても、実行時にメソッドを生成および実行できます。 Just-In-Time (JIT) コンパイラによって作成された実行可能コードは、オブジェクトが再利用されるときに DynamicMethod 再利用されます。 動的メソッドは、少量のコードを生成して実行する最も効率的な方法です。

動的メソッドは、匿名でホストすることも、モジュールまたは型に論理的に関連付けることもできます。

  • 動的メソッドが匿名でホストされている場合、動的メソッドはシステム提供のアセンブリに配置されるため、他のコードから分離されます。 既定では、パブリックではないデータにはアクセスできません。 匿名でホストされる動的メソッドは、フラグを使用して許可ReflectionPermissionされている場合、JIT コンパイラの可視性チェックをスキップする機能をReflectionPermissionFlag.RestrictedMemberAccess制限できます。 動的メソッドによって非パブリック メンバーがアクセスされるアセンブリの信頼レベルは、動的メソッドを生成した呼び出し履歴の信頼レベルと等しいか、そのサブセットである必要があります。 匿名でホストされる動的メソッドの詳細については、「 チュートリアル: 部分信頼シナリオでのコードの出力」を参照してください。

  • 動的メソッドが指定したモジュールに関連付けられている場合、動的メソッドは実質的にそのモジュールに対してグローバルになります。 モジュール内のすべての型と、 internal その型のすべての (Friend Visual Basic の) メンバーにアクセスできます。 コードを含む呼び出し履歴でフラグに対ReflectionPermissionRestrictedMemberAccessする要求を満たすことができる場合は、モジュールを作成したかどうかに関係なく、動的メソッドを任意のモジュールに関連付けることができます。 フラグがReflectionPermissionFlag.MemberAccess許可に含まれている場合、動的メソッドは JIT コンパイラの可視性チェックをスキップし、モジュールまたは任意のアセンブリ内の他のモジュールで宣言されているすべての型のプライベート データにアクセスできます。

    Note

    動的メソッドが関連付けられているモジュールを指定する場合、そのモジュールは、匿名ホスティングに使用されるシステム提供のアセンブリに含まれてはなりません。

  • 動的メソッドが指定した型に関連付けられている場合は、アクセス レベルに関係なく、その型のすべてのメンバーにアクセスできます。 さらに、JIT の可視性チェックはスキップできます。 これにより、動的メソッドは、同じモジュールまたは任意のアセンブリ内の他のモジュールで宣言されている他の型のプライベート データにアクセスできます。 動的メソッドは任意の型に関連付けることができますが、コードは両方のフラグでRestrictedMemberAccessMemberAccess付与ReflectionPermissionする必要があります。

次の表は、フラグが付与されているかどうかReflectionPermissionに応じて、JIT の可視性チェックを使用して、匿名でホストされる動的メソッドからアクセスできる型とメンバーをRestrictedMemberAccess示しています。

可視性チェック RestrictedMemberAccess なし With RestrictedMemberAccess
JIT 可視性チェックをスキップしない 任意のアセンブリ内のパブリック型のパブリック メンバー。 任意のアセンブリ内のパブリック型のパブリック メンバー。
制限付きの JIT 可視性チェックをスキップする 任意のアセンブリ内のパブリック型のパブリック メンバー。 動的メソッドを生成したアセンブリの信頼レベル以下の信頼レベルを持つアセンブリ内の、すべての型のすべてのメンバー。

次の表は、モジュールまたはモジュール内の型に関連付けられている動的メソッドからアクセスできる型とメンバーを示しています。

JIT 可視性チェックをスキップする モジュールに関連付けられている 型に関連付けられている
いいえ モジュール内のパブリック型、内部型、およびプライベート型のパブリック メンバーと内部メンバー。

任意のアセンブリ内のパブリック型のパブリック メンバー。
関連付けられている型のすべてのメンバー。 モジュール内の他のすべての型のパブリック メンバーと内部メンバー。

任意のアセンブリ内のパブリック型のパブリック メンバー。
はい 任意のアセンブリ内のすべての型のすべてのメンバー。 任意のアセンブリ内のすべての型のすべてのメンバー。

モジュールに関連付けられている動的メソッドには、そのモジュールのアクセス許可があります。 型に関連付けられている動的メソッドには、その型を含むモジュールのアクセス許可があります。

動的メソッドとそのパラメーターに名前を付ける必要はありませんが、デバッグに役立つ名前を指定できます。 カスタム属性は、動的メソッドまたはそのパラメーターではサポートされていません。

動的メソッドは static メソッド (Shared Visual Basic のメソッド) ですが、デリゲート バインドの緩やかな規則により、動的メソッドをオブジェクトにバインドできるため、そのデリゲート インスタンスを使用して呼び出されたときにインスタンス メソッドのように機能します。 これを示す例は、メソッドのオーバーロードに対して CreateDelegate(Type, Object) 提供されます。

検証

次の一覧は、動的メソッドに検証不可能なコードを含めることができる条件をまとめたものです。 (たとえば、プロパティが .に設定falseされている場合InitLocals、動的メソッドは検証できません)。

  • セキュリティ クリティカルなアセンブリに関連付けられている動的メソッドもセキュリティ クリティカルであり、検証をスキップできます。 たとえば、デスクトップ アプリケーションとして実行されるセキュリティ属性のないアセンブリは、ランタイムによってセキュリティ クリティカルとして扱われます。 動的メソッドをアセンブリに関連付ける場合、動的メソッドには検証不可能なコードを含めることができます。
  • 検証できないコードを含む動的メソッドがレベル 1 の透過性を持つアセンブリに関連付けられている場合、Just-In-Time (JIT) コンパイラによってセキュリティ要求が挿入されます。 要求は、動的メソッドが完全に信頼されたコードによって実行される場合にのみ成功します。 セキュリティ透過的コード、レベル 1 を参照してください
  • 検証できないコードを含む動的メソッドが、レベル 2 の透過性 (mscorlib.dll など) のアセンブリに関連付けられている場合、セキュリティ要求を行う代わりに (JIT コンパイラによって挿入される) 例外がスローされます。 セキュリティ透過的コード、レベル 2 を参照してください
  • 検証できないコードを含む匿名でホストされる動的メソッドは、常に例外をスローします。 完全に信頼されたコードによって作成および実行された場合でも、検証をスキップすることはできません。

検証できないコードに対してスローされる例外は、動的メソッドの呼び出し方法によって異なります。 メソッドから CreateDelegate 返されたデリゲートを使用して動的メソッドを呼び出すと、a VerificationException がスローされます。 メソッドを使用して動的メソッドをInvoke呼び出すと、内部VerificationExceptionで a TargetInvocationException がスローされます。