ILGenerator.BeginFinallyBlock メソッドとは? わかりやすく解説

Weblio 辞書 > コンピュータ > .NET Framework クラス ライブラリ リファレンス > ILGenerator.BeginFinallyBlock メソッドの意味・解説 

ILGenerator.BeginFinallyBlock メソッド

MSIL (Microsoft Intermediate Language) 命令ストリームfinally ブロック開始します

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

Public Overridable Sub BeginFinallyBlock
Dim instance As ILGenerator

instance.BeginFinallyBlock
public virtual void BeginFinallyBlock ()
public:
virtual void BeginFinallyBlock ()
public void BeginFinallyBlock ()
public function BeginFinallyBlock ()
例外例外
例外種類条件

NotSupportedException

生成されている MSIL (Microsoft intermediate language) は、現在例外ブロック含まれていません。

使用例使用例

BeginFinallyBlock使用方法については、次のコード例参照してください

Imports System
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Security.Permissions

Public Class ILGenerator_BeginFinallyBlock
   Public Shared Function
 AddType() As Type
      ' Create an assembly.
      Dim myAssemblyName As New
 AssemblyName()
      myAssemblyName.Name = "AdderExceptionAsm"

      ' Create dynamic assembly.
      Dim myAppDomain As AppDomain = Thread.GetDomain()
      Dim myAssemblyBuilder As AssemblyBuilder
 = _
            myAppDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run)

      ' Create a dynamic module.
      Dim myModuleBuilder As ModuleBuilder
 = _
            myAssemblyBuilder.DefineDynamicModule("AdderExceptionMod")
      Dim myTypeBuilder As TypeBuilder = myModuleBuilder.DefineType("Adder")
      Dim adderParams() As Type = {GetType(Integer),
 GetType(Integer)}

      ' Define method to add two numbers.
      Dim myMethodBuilder As MethodBuilder
 = _
            myTypeBuilder.DefineMethod("DoAdd", MethodAttributes.Public
 Or _
            MethodAttributes.Static, GetType(Integer),
 adderParams)
      Dim myAdderIL As ILGenerator = myMethodBuilder.GetILGenerator()

      ' Create constructor.
      Dim myConstructorInfo As ConstructorInfo
 = _
            GetType(OverflowException).GetConstructor(New
 Type() {GetType(String)})
      Dim myExToStrMI As MethodInfo = GetType(OverflowException).GetMethod("ToString")
      Dim myWriteLineMI As MethodInfo = _
            GetType(Console).GetMethod("WriteLine",
 New Type() {GetType(String), GetType(Object)})

      ' Declare local variable.
      Dim myLocalBuilder1 As LocalBuilder =
 myAdderIL.DeclareLocal(GetType(Integer))
      Dim myLocalBuilder2 As LocalBuilder =
 myAdderIL.DeclareLocal(GetType(OverflowException))

      ' Define label.
      Dim myFailedLabel As Label = myAdderIL.DefineLabel()
      Dim myEndOfMethodLabel As Label = myAdderIL.DefineLabel()

      ' Begin exception block.
      Dim myLabel As Label = myAdderIL.BeginExceptionBlock()

      myAdderIL.Emit(OpCodes.Ldarg_0)
      myAdderIL.Emit(OpCodes.Ldc_I4_S, 10)
      myAdderIL.Emit(OpCodes.Bgt_S, myFailedLabel)

      myAdderIL.Emit(OpCodes.Ldarg_1)
      myAdderIL.Emit(OpCodes.Ldc_I4_S, 10)
      myAdderIL.Emit(OpCodes.Bgt_S, myFailedLabel)

      myAdderIL.Emit(OpCodes.Ldarg_0)
      myAdderIL.Emit(OpCodes.Ldarg_1)
      myAdderIL.Emit(OpCodes.Add_Ovf_Un)
      myAdderIL.Emit(OpCodes.Stloc_S, myLocalBuilder1)
      myAdderIL.Emit(OpCodes.Br_S, myEndOfMethodLabel)

      myAdderIL.MarkLabel(myFailedLabel)
      myAdderIL.Emit(OpCodes.Ldstr, "Cannot accept values over
 10 for add.")
      myAdderIL.Emit(OpCodes.Newobj, myConstructorInfo)

      myAdderIL.Emit(OpCodes.Stloc_S, myLocalBuilder2)
      myAdderIL.Emit(OpCodes.Ldloc_S, myLocalBuilder2)

      ' Throw the exception.
      myAdderIL.ThrowException(GetType(OverflowException))

      ' Call 'BeginExceptFilterBlock'.
      myAdderIL.BeginExceptFilterBlock()
      myAdderIL.EmitWriteLine("Except filter block called.")

      ' Call catch block.
      myAdderIL.BeginCatchBlock(Nothing)

      ' Call other catch block.
      myAdderIL.BeginCatchBlock(GetType(OverflowException))

      myAdderIL.Emit(OpCodes.Ldstr, "{0}")
      myAdderIL.Emit(OpCodes.Ldloc_S, myLocalBuilder2)
      myAdderIL.EmitCall(OpCodes.Callvirt, myExToStrMI, Nothing)
      myAdderIL.EmitCall(OpCodes.Call, myWriteLineMI, Nothing)
      myAdderIL.Emit(OpCodes.Ldc_I4_M1)
      myAdderIL.Emit(OpCodes.Stloc_S, myLocalBuilder1)

      ' Call finally block.
      myAdderIL.BeginFinallyBlock()
      myAdderIL.EmitWriteLine("Finally block called.")

      ' End the exception block.
      myAdderIL.EndExceptionBlock()

      myAdderIL.MarkLabel(myEndOfMethodLabel)
      myAdderIL.Emit(OpCodes.Ldloc_S, myLocalBuilder1)
      myAdderIL.Emit(OpCodes.Ret)

      Return myTypeBuilder.CreateType()
   End Function 'AddType

   <PermissionSetAttribute(SecurityAction.Demand, Name:="FullTrust")>
 _
   Public Shared Sub Main()
      Dim myAddType As Type = AddType()
      Dim myObject1 As Object
 = Activator.CreateInstance(myAddType)
      Dim myObject2() As Object
 = {15, 15}
      myAddType.InvokeMember("DoAdd", BindingFlags.InvokeMethod,
 Nothing, myObject1, myObject2)
   End Sub 'Main
End Class 'ILGenerator_BeginFinallyBlock
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Security.Permissions;

public class ILGenerator_BeginFinallyBlock
{
   public static Type AddType()
   {
      // Create an assembly.
      AssemblyName myAssemblyName = new AssemblyName();
      myAssemblyName.Name = "AdderExceptionAsm";

      // Create dynamic assembly.
      AppDomain myAppDomain = Thread.GetDomain();
      AssemblyBuilder myAssemblyBuilder = myAppDomain.DefineDynamicAssembly(myAssemblyName
,
         AssemblyBuilderAccess.Run);

      // Create a dynamic module.
      ModuleBuilder myModuleBuilder = myAssemblyBuilder.DefineDynamicModule("AdderExceptionMod");
      TypeBuilder myTypeBuilder = myModuleBuilder.DefineType("Adder");
      Type[] adderParams = new Type[] {typeof(int),
 typeof(int)};

      // Define method to add two numbers.
      MethodBuilder myMethodBuilder = myTypeBuilder.DefineMethod("DoAdd",MethodAttributes.Public
 |
         MethodAttributes.Static,typeof(int),adderParams);
      ILGenerator myAdderIL = myMethodBuilder.GetILGenerator();

      // Create constructor.
      ConstructorInfo myConstructorInfo = typeof(OverflowException).GetConstructor(
         new Type[]{typeof(string)});
      MethodInfo myExToStrMI = typeof(OverflowException).GetMethod("ToString");
      MethodInfo myWriteLineMI = typeof(Console).GetMethod("WriteLine",new
 Type[]
         {typeof(string),typeof(object)});

      // Declare local variable.
      LocalBuilder myLocalBuilder1 = myAdderIL.DeclareLocal(typeof(int));
      LocalBuilder myLocalBuilder2 = myAdderIL.DeclareLocal(typeof(OverflowException));

      // Define label.
      Label myFailedLabel = myAdderIL.DefineLabel();
      Label myEndOfMethodLabel = myAdderIL.DefineLabel();

      // Begin exception block.
      Label myLabel = myAdderIL.BeginExceptionBlock();

      myAdderIL.Emit(OpCodes.Ldarg_0);
      myAdderIL.Emit(OpCodes.Ldc_I4_S, 10);
      myAdderIL.Emit(OpCodes.Bgt_S, myFailedLabel);

      myAdderIL.Emit(OpCodes.Ldarg_1);
      myAdderIL.Emit(OpCodes.Ldc_I4_S, 10);
      myAdderIL.Emit(OpCodes.Bgt_S, myFailedLabel);

      myAdderIL.Emit(OpCodes.Ldarg_0);
      myAdderIL.Emit(OpCodes.Ldarg_1);
      myAdderIL.Emit(OpCodes.Add_Ovf_Un);
      myAdderIL.Emit(OpCodes.Stloc_S, myLocalBuilder1);
      myAdderIL.Emit(OpCodes.Br_S, myEndOfMethodLabel);

      myAdderIL.MarkLabel(myFailedLabel);
      myAdderIL.Emit(OpCodes.Ldstr, "Cannot accept values over 10 for
 add.");
      myAdderIL.Emit(OpCodes.Newobj, myConstructorInfo);

      myAdderIL.Emit(OpCodes.Stloc_S, myLocalBuilder2);
      myAdderIL.Emit(OpCodes.Ldloc_S, myLocalBuilder2);

      // Throw the exception.
      myAdderIL.ThrowException(typeof(OverflowException));

      // Call 'BeginExceptFilterBlock'.
      myAdderIL.BeginExceptFilterBlock();
      myAdderIL.EmitWriteLine("Except filter block called.");

      // Call catch block.
      myAdderIL.BeginCatchBlock(null);
      
      // Call other catch block.
      myAdderIL.BeginCatchBlock(typeof(OverflowException));

      myAdderIL.Emit(OpCodes.Ldstr, "{0}");
      myAdderIL.Emit(OpCodes.Ldloc_S, myLocalBuilder2);
      myAdderIL.EmitCall(OpCodes.Callvirt, myExToStrMI, null);
      myAdderIL.EmitCall(OpCodes.Call, myWriteLineMI, null);
      myAdderIL.Emit(OpCodes.Ldc_I4_M1);
      myAdderIL.Emit(OpCodes.Stloc_S, myLocalBuilder1);

      // Call finally block.
      myAdderIL.BeginFinallyBlock();
      myAdderIL.EmitWriteLine("Finally block called.");

      // End the exception block.
      myAdderIL.EndExceptionBlock();

      myAdderIL.MarkLabel(myEndOfMethodLabel);
      myAdderIL.Emit(OpCodes.Ldloc_S, myLocalBuilder1);
      myAdderIL.Emit(OpCodes.Ret);

      return myTypeBuilder.CreateType();
   }
   [PermissionSetAttribute(SecurityAction.Demand, Name="FullTrust")]
   public static void Main()
   {
      Type myAddType = AddType();
      object myObject1 = Activator.CreateInstance(myAddType);
      object[] myObject2 = new object[]{15,15};
      myAddType.InvokeMember("DoAdd", BindingFlags.InvokeMethod,
         null, myObject1, myObject2);
   }
}
using namespace System;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;

public ref class ILGenerator_BeginFinallyBlock
{
public:
   static Type^ AddType()
   {
      // Create an assembly.
      AssemblyName^ myAssemblyName = gcnew AssemblyName;
      myAssemblyName->Name = "AdderExceptionAsm";

      // Create dynamic assembly.
      AppDomain^ myAppDomain = Thread::GetDomain();
      AssemblyBuilder^ myAssemblyBuilder = myAppDomain->DefineDynamicAssembly(
 myAssemblyName, AssemblyBuilderAccess::Run );

      // Create a dynamic module.
      ModuleBuilder^ myModuleBuilder = myAssemblyBuilder->DefineDynamicModule(
 "AdderExceptionMod" );
      TypeBuilder^ myTypeBuilder = myModuleBuilder->DefineType( "Adder"
 );
      array<Type^>^adderParams = {int::typeid,int::typeid};

      // Define method to add two numbers.
      MethodBuilder^ myMethodBuilder = myTypeBuilder->DefineMethod( "DoAdd",
 static_cast<MethodAttributes>(MethodAttributes::Public | MethodAttributes::Static),
 int::typeid, adderParams );
      ILGenerator^ myAdderIL = myMethodBuilder->GetILGenerator();

      // Create constructor.
      array<Type^>^type1 = {String::typeid};
      ConstructorInfo^ myConstructorInfo = OverflowException::typeid->GetConstructor(
 type1 );
      MethodInfo^ myExToStrMI = OverflowException::typeid->GetMethod( "ToString"
 );
      array<Type^>^type2 = {String::typeid,Object::typeid};
      MethodInfo^ myWriteLineMI = Console::typeid->GetMethod( "WriteLine",
 type2 );

      // Declare local variable.
      LocalBuilder^ myLocalBuilder1 = myAdderIL->DeclareLocal( int::typeid
 );
      LocalBuilder^ myLocalBuilder2 = myAdderIL->DeclareLocal( OverflowException::typeid
 );

      // Define label.
      Label myFailedLabel = myAdderIL->DefineLabel();
      Label myEndOfMethodLabel = myAdderIL->DefineLabel();

      // Begin exception block.
      Label myLabel = myAdderIL->BeginExceptionBlock();
      myAdderIL->Emit( OpCodes::Ldarg_0 );
      myAdderIL->Emit( OpCodes::Ldc_I4_S, 10 );
      myAdderIL->Emit( OpCodes::Bgt_S, myFailedLabel );
      myAdderIL->Emit( OpCodes::Ldarg_1 );
      myAdderIL->Emit( OpCodes::Ldc_I4_S, 10 );
      myAdderIL->Emit( OpCodes::Bgt_S, myFailedLabel );
      myAdderIL->Emit( OpCodes::Ldarg_0 );
      myAdderIL->Emit( OpCodes::Ldarg_1 );
      myAdderIL->Emit( OpCodes::Add_Ovf_Un );
      myAdderIL->Emit( OpCodes::Stloc_S, myLocalBuilder1 );
      myAdderIL->Emit( OpCodes::Br_S, myEndOfMethodLabel );
      myAdderIL->MarkLabel( myFailedLabel );
      myAdderIL->Emit( OpCodes::Ldstr, "Cannot accept values over 10 for
 add." );
      myAdderIL->Emit( OpCodes::Newobj, myConstructorInfo );
      myAdderIL->Emit( OpCodes::Stloc_S, myLocalBuilder2 );
      myAdderIL->Emit( OpCodes::Ldloc_S, myLocalBuilder2 );

      // Throw the exception.
      myAdderIL->ThrowException( OverflowException::typeid );

      // Call 'BeginExceptFilterBlock'.
      myAdderIL->BeginExceptFilterBlock();
      myAdderIL->EmitWriteLine( "Except filter block called." );

      // Call catch block.
      myAdderIL->BeginCatchBlock( nullptr );

      // Call other catch block.
      myAdderIL->BeginCatchBlock( OverflowException::typeid );
      myAdderIL->Emit( OpCodes::Ldstr, "{0}" );
      myAdderIL->Emit( OpCodes::Ldloc_S, myLocalBuilder2 );
      myAdderIL->EmitCall( OpCodes::Callvirt, myExToStrMI, nullptr );
      myAdderIL->EmitCall( OpCodes::Call, myWriteLineMI, nullptr );
      myAdderIL->Emit( OpCodes::Ldc_I4_M1 );
      myAdderIL->Emit( OpCodes::Stloc_S, myLocalBuilder1 );

      // Call finally block.
      myAdderIL->BeginFinallyBlock();
      myAdderIL->EmitWriteLine( "Finally block called." );

      // End the exception block.
      myAdderIL->EndExceptionBlock();
      myAdderIL->MarkLabel( myEndOfMethodLabel );
      myAdderIL->Emit( OpCodes::Ldloc_S, myLocalBuilder1 );
      myAdderIL->Emit( OpCodes::Ret );
      return myTypeBuilder->CreateType();
   }
};

int main()
{
   Type^ myAddType = ILGenerator_BeginFinallyBlock::AddType();
   Object^ myObject1 = Activator::CreateInstance( myAddType );
   array<Object^>^myObject2 = {15,15};
   myAddType->InvokeMember( "DoAdd", BindingFlags::InvokeMethod, nullptr,
 myObject1, myObject2 );
}
import System.*;
import System.Threading.*;
import System.Reflection.*;
import System.Reflection.Emit.*;

public class ILGenerator_BeginFinallyBlock
{
    public static Type AddType()
    {
        // Create an assembly.
        AssemblyName myAssemblyName = new AssemblyName();
        myAssemblyName.set_Name("AdderExceptionAsm");

        // Create dynamic assembly.
        AppDomain myAppDomain = System.Threading.Thread.GetDomain();
        AssemblyBuilder myAssemblyBuilder = myAppDomain.DefineDynamicAssembly(
            myAssemblyName, AssemblyBuilderAccess.Run);

        // Create a dynamic module.
        ModuleBuilder myModuleBuilder = myAssemblyBuilder.
            DefineDynamicModule("AdderExceptionMod");
        TypeBuilder myTypeBuilder = myModuleBuilder.DefineType("Adder");
        Type adderParams[] = new Type[] {int.class.ToType(),
 
            int.class.ToType() };

        // Define method to add two numbers.
        MethodBuilder myMethodBuilder = myTypeBuilder.
            DefineMethod("DoAdd", MethodAttributes.Public | 
            MethodAttributes.Static, int.class.ToType(),
 adderParams);
        ILGenerator myAdderIL = myMethodBuilder.GetILGenerator();

        // Create constructor.
        ConstructorInfo myConstructorInfo = OverflowException.class.
            ToType().GetConstructor(new Type[] { String.class.ToType()
 });
        MethodInfo myExToStrMI = OverflowException.class.ToType().
            GetMethod("ToString");
        MethodInfo myWriteLineMI = Console.class.ToType().
            GetMethod("WriteLine", new Type[] { String.class.
                ToType(), Object.class.ToType() });

        // Declare local variable.
        LocalBuilder myLocalBuilder1 = myAdderIL.DeclareLocal(int.
            class.ToType());
        LocalBuilder myLocalBuilder2 = myAdderIL.DeclareLocal(
            OverflowException.class.ToType());
        // Define label.
        Label myFailedLabel = myAdderIL.DefineLabel();
        Label myEndOfMethodLabel = myAdderIL.DefineLabel();
        // Begin exception block.
        Label myLabel = myAdderIL.BeginExceptionBlock();

        myAdderIL.Emit(OpCodes.Ldarg_0);
        myAdderIL.Emit(OpCodes.Ldc_I4_S, 10);
        myAdderIL.Emit(OpCodes.Bgt_S, myFailedLabel);
        myAdderIL.Emit(OpCodes.Ldarg_1);
        myAdderIL.Emit(OpCodes.Ldc_I4_S, 10);
        myAdderIL.Emit(OpCodes.Bgt_S, myFailedLabel);
        myAdderIL.Emit(OpCodes.Ldarg_0);
        myAdderIL.Emit(OpCodes.Ldarg_1);
        myAdderIL.Emit(OpCodes.Add_Ovf_Un);
        myAdderIL.Emit(OpCodes.Stloc_S, myLocalBuilder1);
        myAdderIL.Emit(OpCodes.Br_S, myEndOfMethodLabel);
        myAdderIL.MarkLabel(myFailedLabel);
        myAdderIL.Emit(OpCodes.Ldstr, "Cannot accept values over 10 for
 add.");
        myAdderIL.Emit(OpCodes.Newobj, myConstructorInfo);
        myAdderIL.Emit(OpCodes.Stloc_S, myLocalBuilder2);
        myAdderIL.Emit(OpCodes.Ldloc_S, myLocalBuilder2);

        // Throw the exception.
        myAdderIL.ThrowException(OverflowException.class.ToType());

        // Call 'BeginExceptFilterBlock'.
        myAdderIL.BeginExceptFilterBlock();
        myAdderIL.EmitWriteLine("Except filter block called.");

        // Call catch block.
        myAdderIL.BeginCatchBlock(null);

        // Call other catch block.
        myAdderIL.BeginCatchBlock(OverflowException.class.ToType());
        myAdderIL.Emit(OpCodes.Ldstr, "{0}");
        myAdderIL.Emit(OpCodes.Ldloc_S, myLocalBuilder2);
        myAdderIL.EmitCall(OpCodes.Callvirt, myExToStrMI, null);
        myAdderIL.EmitCall(OpCodes.Call, myWriteLineMI, null);
        myAdderIL.Emit(OpCodes.Ldc_I4_M1);
        myAdderIL.Emit(OpCodes.Stloc_S, myLocalBuilder1);

        // Call finally block.
        myAdderIL.BeginFinallyBlock();
        myAdderIL.EmitWriteLine("Finally block called.");

        // End the exception block.
        myAdderIL.EndExceptionBlock();
        myAdderIL.MarkLabel(myEndOfMethodLabel);
        myAdderIL.Emit(OpCodes.Ldloc_S, myLocalBuilder1);
        myAdderIL.Emit(OpCodes.Ret);
        return myTypeBuilder.CreateType();
    } //AddType

    public static void main(String[]
 args)
    {
        Type myAddType = AddType();
        Object myObject1 = Activator.CreateInstance(myAddType);
        Object myObject2[] = new Object[] { (Int32) 15,
            (Int32)15 };

        myAddType.InvokeMember("DoAdd", BindingFlags.InvokeMethod,
            null, myObject1, myObject2);
    } //main
} //ILGenerator_BeginFinallyBlock
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
ILGenerator クラス
ILGenerator メンバ
System.Reflection.Emit 名前空間


このページでは「.NET Framework クラス ライブラリ リファレンス」からILGenerator.BeginFinallyBlock メソッドを検索した結果を表示しています。
Weblioに収録されているすべての辞書からILGenerator.BeginFinallyBlock メソッドを検索する場合は、下記のリンクをクリックしてください。
 全ての辞書からILGenerator.BeginFinallyBlock メソッド を検索

英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

ILGenerator.BeginFinallyBlock メソッドのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



ILGenerator.BeginFinallyBlock メソッドのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2025 Microsoft.All rights reserved.

©2025 GRAS Group, Inc.RSS