英語で読む

次の方法で共有


MethodBody クラス

定義

メソッド本体のメタデータおよび MSIL にアクセスできるようにします。

C#
public class MethodBody
C#
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class MethodBody
C#
[System.Runtime.InteropServices.ComVisible(true)]
public class MethodBody
継承
MethodBody
属性

次のコード例では、 という名前 MethodBodyExample のテスト メソッドを定義し、ローカル変数情報と例外処理句を表示します。 メソッドは MethodBase.GetMethodBody 、テスト メソッドの オブジェクトを MethodBody 取得するために使用されます。

この例では、 プロパティを LocalVariables 使用してオブジェクトの LocalVariableInfo 一覧を取得し、その型とインデックスの順序を表示します。 プロパティは ExceptionHandlingClauses 、例外処理句の一覧を取得するために使用されます。

C#
using System;
using System.Reflection;

public class Example
{
    public static void Main()
    {
        // Get method body information.
        MethodInfo mi = typeof(Example).GetMethod("MethodBodyExample");
        MethodBody mb = mi.GetMethodBody();
        Console.WriteLine("\r\nMethod: {0}", mi);

        // Display the general information included in the
        // MethodBody object.
        Console.WriteLine("    Local variables are initialized: {0}",
            mb.InitLocals);
        Console.WriteLine("    Maximum number of items on the operand stack: {0}",
            mb.MaxStackSize);

        // Display information about the local variables in the
        // method body.
        Console.WriteLine();
        foreach (LocalVariableInfo lvi in mb.LocalVariables)
        {
            Console.WriteLine("Local variable: {0}", lvi);
        }

        // Display exception handling clauses.
        Console.WriteLine();
        foreach (ExceptionHandlingClause ehc in mb.ExceptionHandlingClauses)
        {
            Console.WriteLine(ehc.Flags.ToString());

            // The FilterOffset property is meaningful only for Filter
            // clauses. The CatchType property is not meaningful for
            // Filter or Finally clauses.
            switch (ehc.Flags)
            {
                case ExceptionHandlingClauseOptions.Filter:
                    Console.WriteLine("        Filter Offset: {0}",
                        ehc.FilterOffset);
                    break;
                case ExceptionHandlingClauseOptions.Finally:
                    break;
                default:
                    Console.WriteLine("    Type of exception: {0}",
                        ehc.CatchType);
                    break;
            }

            Console.WriteLine("       Handler Length: {0}", ehc.HandlerLength);
            Console.WriteLine("       Handler Offset: {0}", ehc.HandlerOffset);
            Console.WriteLine("     Try Block Length: {0}", ehc.TryLength);
            Console.WriteLine("     Try Block Offset: {0}", ehc.TryOffset);
        }
    }

    // The Main method contains code to analyze this method, using
    // the properties and methods of the MethodBody class.
    public void MethodBodyExample(object arg)
    {
        // Define some local variables. In addition to these variables,
        // the local variable list includes the variables scoped to
        // the catch clauses.
        int var1 = 42;
        string var2 = "Forty-two";

        try
        {
            // Depending on the input value, throw an ArgumentException or
            // an ArgumentNullException to test the Catch clauses.
            if (arg == null)
            {
                throw new ArgumentNullException("The argument cannot be null.");
            }
            if (arg.GetType() == typeof(string))
            {
                throw new ArgumentException("The argument cannot be a string.");
            }
        }

        // This filter clause selects only exceptions that derive
        // from the ArgumentException class.
        // Other exceptions, including ArgumentException itself,
        // are not handled by this filter clause.
        catch (ArgumentException ex) when (ex.GetType().IsSubclassOf(typeof(ArgumentException)))
        {
            Console.WriteLine("Filter clause caught: {0}", ex.GetType());
        }

        // This catch clause handles the ArgumentException class, and
        // any other class derived from Exception.
        catch(Exception ex)
        {
            Console.WriteLine("Ordinary exception-handling clause caught: {0}",
                ex.GetType());
        }
        finally
        {
            var1 = 3033;
            var2 = "Another string.";
        }
    }
}

// This code example produces output similar to the following:
//
//Method: Void MethodBodyExample(System.Object)
//    Local variables are initialized: True
//    Maximum number of items on the operand stack: 2
//
//Local variable: System.Int32 (0)
//Local variable: System.String (1)
//Local variable: System.Exception (2)
//Local variable: System.Boolean (3)
//
//Filter
//      Filter Offset: 71
//      Handler Length: 23
//      Handler Offset: 116
//      Try Block Length: 61
//      Try Block Offset: 10
//Clause
//    Type of exception: System.Exception
//       Handler Length: 21
//       Handler Offset: 70
//     Try Block Length: 61
//     Try Block Offset: 9
//Finally
//       Handler Length: 14
//       Handler Offset: 94
//     Try Block Length: 85
//     Try Block Offset: 9

注釈

クラスは MethodBody 、メソッド本体のローカル変数と例外処理句に関する情報、およびメソッド本体を構成する Microsoft 中間言語 (MSIL) へのアクセスを提供します。

、、、 などのResolveTypeResolveMethodResolveTypeモジュール クラスのトークン解決メソッドを使用して、メソッド本体のトークンをTypeMethodInfoメソッド本体で MSIL によってアクセスされる型、メソッド、FieldInfoフィールドに関する詳細情報を提供するオブジェクト、オブジェクト、およびオブジェクトに解決できます。

注意

メソッド本体の解析には、メタデータと MSIL 命令形式を十分に理解する必要があります。 情報については、 共通言語インフラストラクチャ (CLI) のドキュメント(特にパーティション II: メタデータ定義とセマンティクス)を参照してください。

特定のメソッドのオブジェクトをMethodBody取得するには、まず メソッドの オブジェクトをMethodInfo取得してから、オブジェクトの GetMethodBody メソッドをMethodInfo呼び出します。

コンストラクター

MethodBody()

MethodBody クラスの新しいインスタンスを初期化します。

プロパティ

ExceptionHandlingClauses

メソッドの本体にあるすべての例外処理句を含むリストを取得します。

InitLocals

メソッド本体のローカル変数がその型の既定値に初期化されるかどうかを示す値を取得します。

LocalSignatureMetadataToken

メタデータ内のメソッドのローカル変数を示すシグネチャのメタデータ トークンを取得します。

LocalVariables

メソッド本体で宣言されているローカル変数のリストを取得します。

MaxStackSize

メソッド実行時のオペランド スタックのアイテムの最大数を取得します。

メソッド

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetILAsByteArray()

メソッド本体の MSIL をバイト配列として返します。

GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

適用対象

製品 バージョン
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1