MethodBuilder.CreateMethodBody(Byte[], Int32) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
Microsoft intermediate language (MSIL) の命令の指定されたバイト配列を使用して、メソッドの本体を作成します。
public:
void CreateMethodBody(cli::array <System::Byte> ^ il, int count);
public void CreateMethodBody (byte[] il, int count);
member this.CreateMethodBody : byte[] * int -> unit
Public Sub CreateMethodBody (il As Byte(), count As Integer)
パラメーター
- il
- Byte[]
有効な MSIL 命令を含む配列。 このパラメーターが null
の場合、メソッドの本体がクリアされます。
- count
- Int32
MSIL 配列内の有効なバイト数。 MSIL が null
の場合、この値は無視されます。
例外
count
が指定の MSIL 命令の配列のインデックスの範囲内になく、il
が null
ではありません。
含まれている型は、CreateType() を使用して以前に作成されています。
- または -
このメソッドは、null
ではなかった il
引数を使用して以前にこの MethodBuilder
で呼び出されました。
- または -
現在のメソッドでは、IsGenericMethod プロパティは true
ですが、IsGenericMethodDefinition プロパティは false
です。
例
次に示す例では、 を使用して CreateMethodBody
オペコードを使用して 2 つの整数を追加する簡単なメソッドが生成されます。
using namespace System;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
class MethodBodyDemo
{
public:
// This class will demonstrate how to create a method body using
// the MethodBuilder::CreateMethodBody(Byte[], int) method.
static Type^ BuildDynType()
{
Type^ addType = nullptr;
AppDomain^ currentDom = Thread::GetDomain();
AssemblyName^ myAsmName = gcnew AssemblyName;
myAsmName->Name = "MyDynamicAssembly";
AssemblyBuilder^ myAsmBldr = currentDom->DefineDynamicAssembly( myAsmName, AssemblyBuilderAccess::RunAndSave );
// The dynamic assembly space has been created. Next, create a module
// within it. The type Point will be reflected into this module.
ModuleBuilder^ myModuleBldr = myAsmBldr->DefineDynamicModule( "MyModule" );
TypeBuilder^ myTypeBldr = myModuleBldr->DefineType( "Adder" );
array<Type^>^temp0 = {int::typeid,int::typeid};
MethodBuilder^ myMthdBldr = myTypeBldr->DefineMethod( "DoAdd", static_cast<MethodAttributes>(MethodAttributes::Public | MethodAttributes::Static), int::typeid, temp0 );
// Build the array of Bytes holding the MSIL instructions.
/* 02h is the opcode for ldarg.0 */
/* 03h is the opcode for ldarg.1 */
/* 58h is the opcode for add */
/* 2Ah is the opcode for ret */
array<Byte>^temp1 = {0x02,0x03,0x58,0x2A};
array<Byte>^ILcodes = temp1;
myMthdBldr->CreateMethodBody( ILcodes, ILcodes->Length );
addType = myTypeBldr->CreateType();
return addType;
}
};
int main()
{
Type^ myType = MethodBodyDemo::BuildDynType();
Console::WriteLine( "---" );
Console::Write( "Enter the first integer to add: " );
int aVal = Convert::ToInt32( Console::ReadLine() );
Console::Write( "Enter the second integer to add: " );
int bVal = Convert::ToInt32( Console::ReadLine() );
Object^ adderInst = Activator::CreateInstance( myType, gcnew array<Object^>(0) );
array<Object^>^temp1 = {aVal,bVal};
Console::WriteLine( "The value of adding {0} to {1} is: {2}.", aVal, bVal, myType->InvokeMember( "DoAdd", BindingFlags::InvokeMethod, nullptr, adderInst, temp1 ) );
}
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
class MethodBodyDemo {
// This class will demonstrate how to create a method body using
// the MethodBuilder.CreateMethodBody(byte[], int) method.
public static Type BuildDynType() {
Type addType = null;
AppDomain currentDom = Thread.GetDomain();
AssemblyName myAsmName = new AssemblyName();
myAsmName.Name = "MyDynamicAssembly";
AssemblyBuilder myAsmBldr = currentDom.DefineDynamicAssembly(
myAsmName,
AssemblyBuilderAccess.RunAndSave);
// The dynamic assembly space has been created. Next, create a module
// within it. The type Point will be reflected into this module.
ModuleBuilder myModuleBldr = myAsmBldr.DefineDynamicModule("MyModule");
TypeBuilder myTypeBldr = myModuleBldr.DefineType("Adder");
MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("DoAdd",
MethodAttributes.Public |
MethodAttributes.Static,
typeof(int),
new Type[]
{typeof(int), typeof(int)});
// Build the array of Bytes holding the MSIL instructions.
byte[] ILcodes = new byte[] {
0x02, /* 02h is the opcode for ldarg.0 */
0x03, /* 03h is the opcode for ldarg.1 */
0x58, /* 58h is the opcode for add */
0x2A /* 2Ah is the opcode for ret */
};
myMthdBldr.CreateMethodBody(ILcodes, ILcodes.Length);
addType = myTypeBldr.CreateType();
return addType;
}
public static void Main() {
Type myType = BuildDynType();
Console.WriteLine("---");
Console.Write("Enter the first integer to add: ");
int aVal = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter the second integer to add: ");
int bVal = Convert.ToInt32(Console.ReadLine());
object adderInst = Activator.CreateInstance(myType, new object[0]);
Console.WriteLine("The value of adding {0} to {1} is: {2}.",
aVal, bVal,
myType.InvokeMember("DoAdd",
BindingFlags.InvokeMethod,
null,
adderInst,
new object[] {aVal, bVal}));
}
}
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
_
Class MethodBodyDemo
' This class will demonstrate how to create a method body using
' the MethodBuilder.CreateMethodBody(byte[], int) method.
Public Shared Function BuildDynType() As Type
Dim addType As Type = Nothing
Dim currentDom As AppDomain = Thread.GetDomain()
Dim myAsmName As New AssemblyName()
myAsmName.Name = "MyDynamicAssembly"
Dim myAsmBldr As AssemblyBuilder = currentDom.DefineDynamicAssembly(myAsmName, _
AssemblyBuilderAccess.RunAndSave)
' The dynamic assembly space has been created. Next, create a module
' within it. The type Point will be reflected into this module.
Dim myModuleBldr As ModuleBuilder = myAsmBldr.DefineDynamicModule("MyModule")
Dim myTypeBldr As TypeBuilder = myModuleBldr.DefineType("Adder")
Dim myMthdBldr As MethodBuilder = myTypeBldr.DefineMethod("DoAdd", _
MethodAttributes.Public Or MethodAttributes.Static, _
GetType(Integer), _
New Type() {GetType(Integer), GetType(Integer)})
' Build the array of Bytes holding the MSIL instructions.
Dim ILcodes() As Byte = {&H2, &H3, &H58, &H2A}
' 02h is the opcode for ldarg.0
' 03h is the opcode for ldarg.1
' 58h is the opcode for add
' 2Ah is the opcode for ret
myMthdBldr.CreateMethodBody(ILcodes, ILcodes.Length)
addType = myTypeBldr.CreateType()
Return addType
End Function 'BuildDynType
Public Shared Sub Main()
Dim myType As Type = BuildDynType()
Console.WriteLine("---")
Console.Write("Enter the first integer to add: ")
Dim aVal As Integer = Convert.ToInt32(Console.ReadLine())
Console.Write("Enter the second integer to add: ")
Dim bVal As Integer = Convert.ToInt32(Console.ReadLine())
Dim adderInst As Object = Activator.CreateInstance(myType, New Object() {})
Console.WriteLine("The value of adding {0} to {1} is: {2}.", _
aVal, bVal, _
myType.InvokeMember("DoAdd", _
BindingFlags.InvokeMethod, _
Nothing, _
adderInst, _
New Object() {aVal, bVal}))
End Sub
End Class
注釈
このメソッドは、MSIL 命令を含む配列から il
メソッドの本体をオペコードとして作成します。 有効な MSIL のバイト数は count によって指定されます。
注意
現在、これは完全にはサポートされていません。 ユーザーは、トークン修正アップと例外ハンドラーの場所を指定できません。
適用対象
.NET