DynamicMethod コンストラクター
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
動的メソッドを作成します。
オーバーロード
DynamicMethod(String, Type, Type[]) |
メソッド名、戻り値の型、パラメーターの型を指定して、匿名でホストされる動的メソッドを初期化します。 |
DynamicMethod(String, Type, Type[], Boolean) |
メソッド名、戻り値の型、パラメーターの型を指定し、さらに Just-In-Time (JIT) 参照範囲チェックが動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーをスキップするかどうかを指定して、匿名ホスト対象の動的メソッドを初期化します。 |
DynamicMethod(String, Type, Type[], Module) |
モジュールに対してグローバルに適用される動的メソッドを作成し、メソッド名、戻り値の型、パラメーターの型、およびモジュールを指定します。 |
DynamicMethod(String, Type, Type[], Type) |
メソッド名、戻り値の型、パラメーターの型、および動的メソッドが論理的に関連付けられる型を指定して、動的メソッドを作成します。 |
DynamicMethod(String, Type, Type[], Module, Boolean) |
メソッド名、戻り値の型、パラメーターの型、モジュールを指定し、さらに Just-In-Time (JIT) 参照範囲チェックが動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーをスキップするかどうかを指定して、モジュールに対してグローバルな動的メソッドを作成します。 |
DynamicMethod(String, Type, Type[], Type, Boolean) |
メソッド名、戻り値の型、パラメーターの型、動的メソッドが論理的に関連付けられている型を指定し、さらに動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーに対する Just-In-Time (JIT) 参照範囲チェックをスキップするかどうかを指定して、動的メソッドを作成します。 |
DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Module, Boolean) |
メソッド名、属性、呼び出し規約、戻り値の型、パラメーターの型、モジュールを指定し、さらに Just-In-Time (JIT) 参照範囲チェックが動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーをスキップするかどうかを指定して、動的メソッドを作成します。 |
DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type, Boolean) |
メソッド名、属性、呼び出し規則、戻り値の型、パラメーターの型、動的メソッドが論理的に関連付けられている型を指定し、さらに Just-In-Time (JIT) 参照範囲チェックが動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーをスキップするかどうかを指定して、動的メソッドを作成します。 |
DynamicMethod(String, Type, Type[])
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
メソッド名、戻り値の型、パラメーターの型を指定して、匿名でホストされる動的メソッドを初期化します。
public:
DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes);
public DynamicMethod (string name, Type? returnType, Type[]? parameterTypes);
public DynamicMethod (string name, Type returnType, Type[] parameterTypes);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type())
パラメーター
- name
- String
動的メソッドの名前。 これには長さ 0 の文字列も可能ですが、null
にすることはできません。
例外
parameterTypes
の要素が null
または Void です。
name
が null
です。
.NET Framework バージョンと .NET Core バージョンが 2.1 より前の場合: returnType
は を返すIsByReftrue
型です。
注釈
このコンストラクターによって作成される動的メソッドは、既存の型またはモジュールではなく匿名アセンブリに関連付けられます。 匿名アセンブリは、動的メソッド (つまり、他のコードから分離する) のサンドボックス環境を提供するためにのみ存在します。 この環境により、部分的に信頼されたコードによって動的メソッドが出力および実行されるのを安全に行うことができます。
このコンストラクターは、動的メソッドの Microsoft 中間言語 (MSIL) に対して Just-In-Time (JIT) の可視性チェックを適用することを指定します。 つまり、動的メソッドのコードは、パブリック クラスのパブリック メソッドにアクセスできます。 メソッドが、または (Visual Basic では)Friend
の型またはinternal
メンバーにアクセスしようとすると、例外がprivate
protected
スローされます。 JIT 可視性チェックをスキップする機能が制限されている動的メソッドを作成するには、 コンストラクターを DynamicMethod(String, Type, Type[], Boolean) 使用します。
匿名でホストされる動的メソッドが構築されると、出力アセンブリの呼び出し履歴が含まれます。 メソッドが呼び出されると、実際の呼び出し元のアクセス許可ではなく、出力アセンブリのアクセス許可が使用されます。 したがって、動的メソッドは、信頼レベルが高いアセンブリに渡されて実行された場合でも、それを出力したアセンブリよりも高いレベルの特権で実行することはできません。
このコンストラクターは、メソッド属性 MethodAttributes.Public と、 および MethodAttributes.Static呼び出し規約 を指定します CallingConventions.Standard。
注意
このコンストラクターは、.NET Framework 3.5 以降で導入されました。
こちらもご覧ください
適用対象
DynamicMethod(String, Type, Type[], Boolean)
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
メソッド名、戻り値の型、パラメーターの型を指定し、さらに Just-In-Time (JIT) 参照範囲チェックが動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーをスキップするかどうかを指定して、匿名ホスト対象の動的メソッドを初期化します。
public:
DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, bool restrictedSkipVisibility);
public DynamicMethod (string name, Type? returnType, Type[]? parameterTypes, bool restrictedSkipVisibility);
public DynamicMethod (string name, Type returnType, Type[] parameterTypes, bool restrictedSkipVisibility);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), restrictedSkipVisibility As Boolean)
パラメーター
- name
- String
動的メソッドの名前。 これには長さ 0 の文字列も可能ですが、null
にすることはできません。
- restrictedSkipVisibility
- Boolean
動的メソッドの MSIL によりアクセスされる型およびメンバーに対する JIT 参照範囲チェックをスキップする場合は true
(ただし、それらの型およびメンバーが含まれるアセンブリの信頼レベルは、動的メソッドを出力する呼び出しスタックの信頼レベル以下でなければならないという制限あり)。それ以外の場合は false
。
例外
parameterTypes
の要素が null
または Void です。
name
が null
です。
.NET Framework バージョンと .NET Core バージョンが 2.1 より前の場合: returnType
は を返すIsByReftrue
型です。
注釈
このコンストラクターによって作成される動的メソッドは、既存の型またはモジュールではなく匿名アセンブリに関連付けられます。 匿名アセンブリは、動的メソッド (つまり、他のコードから分離する) のサンドボックス環境を提供するためにのみ存在します。 この環境により、部分的に信頼されたコードによって動的メソッドが出力および実行されるのを安全に行うことができます。
匿名でホストされる動的メソッドは、または ( Visual Basic では )Friend
である型またはinternal
メンバーprivate
protected
に対する自動アクセス権を持っていません。 これは、既存の型またはモジュールに関連付けられている動的メソッドとは異なり、関連付けられたスコープ内の非表示のメンバーにアクセスできます。
動的メソッドが、または の型またはメンバーにアクセスするprotected
private
必要があるかどうかを にrestrictedSkipVisibility
指定true
しますinternal
。 これにより、動的メソッドにこれらのメンバーへのアクセスが制限されます。 つまり、メンバーは、次の条件が満たされている場合にのみアクセスできます。
ターゲット メンバーは、動的メソッドを出力する呼び出し履歴以下の信頼レベルを持つアセンブリに属します。
動的メソッドを出力する呼び出し履歴には、 フラグがReflectionPermissionFlag.RestrictedMemberAccess付与されますReflectionPermission。 これは、コードが完全信頼で実行される場合に常に当てはまります。 部分的に信頼されたコードの場合、ホストが明示的にアクセス許可を付与する場合にのみ true です。
重要
アクセス許可が付与されていない場合、このコンストラクターが呼び出されたときではなく、 が呼び出されたとき CreateDelegate 、または動的メソッドが呼び出されたときに、セキュリティ例外がスローされます。 動的メソッドを出力するために特別なアクセス許可は必要ありません。
たとえば、 を に設定してtrue
作成された動的メソッドは、呼び出し履歴に制限付きrestrictedSkipVisibility
メンバー アクセスが許可されている場合、呼び出し履歴上の任意のアセンブリのプライベート メンバーにアクセスできます。 呼び出し履歴で部分的に信頼されたコードを使用して動的メソッドが作成された場合、そのようなアセンブリは完全に信頼されているため、.NET Framework アセンブリ内の型のプライベート メンバーにアクセスできません。
が の場合 restrictedSkipVisibility
、 false
JIT 可視性チェックが適用されます。 動的メソッドのコードはパブリック クラスのパブリック メソッドにアクセスでき、または internal
の型またはメンバーにアクセスしようとすると例外がprivate
protected
スローされます。
匿名でホストされる動的メソッドが構築されると、出力アセンブリの呼び出し履歴が含まれます。 メソッドが呼び出されると、実際の呼び出し元のアクセス許可ではなく、出力呼び出し履歴のアクセス許可が使用されます。 したがって、動的メソッドは、信頼レベルが高いアセンブリに渡されて実行された場合でも、それを出力したアセンブリよりも高いレベルの特権で実行することはできません。
このコンストラクターは、メソッド属性 MethodAttributes.Public と、 および MethodAttributes.Static呼び出し規約 を指定します CallingConventions.Standard。
注意
このコンストラクターは、.NET Framework 3.5 以降で導入されました。
こちらもご覧ください
適用対象
DynamicMethod(String, Type, Type[], Module)
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
モジュールに対してグローバルに適用される動的メソッドを作成し、メソッド名、戻り値の型、パラメーターの型、およびモジュールを指定します。
public:
DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, System::Reflection::Module ^ m);
public DynamicMethod (string name, Type? returnType, Type[]? parameterTypes, System.Reflection.Module m);
public DynamicMethod (string name, Type returnType, Type[] parameterTypes, System.Reflection.Module m);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * System.Reflection.Module -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), m As Module)
パラメーター
- name
- String
動的メソッドの名前。 これには長さ 0 の文字列も可能ですが、null
にすることはできません。
例外
.NET Framework バージョンと .NET Core バージョンが 2.1 より前の場合: returnType
は を返すIsByReftrue
型です。
例
次のコード例では、2 つのパラメーターを受け取る動的メソッドを作成します。 この例では、最初のパラメーターをコンソールに出力する単純な関数本体を出力し、2 番目のパラメーターを メソッドの戻り値として使用します。 この例では、デリゲートを作成してメソッドを完了し、さまざまなパラメーターを使用してデリゲートを呼び出し、最後に メソッドを使用して動的メソッドを Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) 呼び出します。
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
public ref class Test
{
};
// Declare a delegate that will be used to execute the completed
// dynamic method.
delegate int HelloInvoker(String^ msg, int ret);
int main()
{
// Create an array that specifies the types of the parameters
// of the dynamic method. This method has a string parameter
// and an int parameter.
array<Type^>^ helloArgs = {String::typeid, int::typeid};
// Create a dynamic method with the name "Hello", a return type
// of int, and two parameters whose types are specified by the
// array helloArgs. Create the method in the module that
// defines the Test class.
DynamicMethod^ hello = gcnew DynamicMethod("Hello",
int::typeid,
helloArgs,
Test::typeid->Module);
// Create an array that specifies the parameter types of the
// overload of Console.WriteLine to be used in Hello.
array<Type^>^ writeStringArgs = {String::typeid};
// Get the overload of Console.WriteLine that has one
// String parameter.
MethodInfo^ writeString =
Console::typeid->GetMethod("WriteLine", writeStringArgs);
// Get an ILGenerator and emit a body for the dynamic method.
ILGenerator^ ilgen = hello->GetILGenerator();
// Load the first argument, which is a string, onto the stack.
ilgen->Emit(OpCodes::Ldarg_0);
// Call the overload of Console.WriteLine that prints a string.
ilgen->EmitCall(OpCodes::Call, writeString, nullptr);
// The Hello method returns the value of the second argument;
// to do this, load the onto the stack and return.
ilgen->Emit(OpCodes::Ldarg_1);
ilgen->Emit(OpCodes::Ret);
// Create a delegate that represents the dynamic method. This
// action completes the method, and any further attempts to
// change the method will cause an exception.
HelloInvoker^ helloDelegate =
(HelloInvoker^) hello->CreateDelegate(HelloInvoker::typeid);
// Use the delegate to execute the dynamic method. Save and
// print the return value.
int returnValue = helloDelegate("\r\nHello, World!", 42);
Console::WriteLine("helloDelegate(\"Hello, World!\", 42) returned {0}",
returnValue);
// Do it again, with different arguments.
returnValue = helloDelegate("\r\nHi, Mom!", 5280);
Console::WriteLine("helloDelegate(\"Hi, Mom!\", 5280) returned {0}",
returnValue);
// Create an array of arguments to use with the Invoke method.
array<Object^>^ delegateArgs = {"\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 ValueType arguments
// must be boxed.
Object^ returnValueObject = hello->Invoke(nullptr, delegateArgs);
Console::WriteLine("hello.Invoke returned {0}", returnValueObject);
}
using System;
using System.Reflection;
using System.Reflection.Emit;
using Microsoft.VisualBasic;
public class Test
{
// Declare a delegate that will be used to execute the completed
// dynamic method.
private delegate int HelloInvoker(string msg, int ret);
public static void Main()
{
// Create an array that specifies the types of the parameters
// of the dynamic method. This method has a string parameter
// and an int parameter.
Type[] helloArgs = {typeof(string), typeof(int)};
// Create a dynamic method with the name "Hello", a return type
// of int, and two parameters whose types are specified by the
// array helloArgs. Create the method in the module that
// defines the Test class.
DynamicMethod hello = new DynamicMethod("Hello",
typeof(int),
helloArgs,
typeof(Test).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.
ILGenerator il = hello.GetILGenerator();
// 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);
// Create a delegate that represents the dynamic method. This
// action completes the method, and any further attempts to
// change the method will cause an exception.
HelloInvoker hi =
(HelloInvoker) hello.CreateDelegate(typeof(HelloInvoker));
// Use the delegate to execute the dynamic method. Save and
// print the return value.
int retval = hi("\r\nHello, World!", 42);
Console.WriteLine("Executing delegate hi(\"Hello, World!\", 42) returned {0}",
retval);
// Do it again, with different arguments.
retval = hi("\r\nHi, Mom!", 5280);
Console.WriteLine("Executing delegate hi(\"Hi, Mom!\", 5280) returned {0}",
retval);
// 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 ValueType arguments
// must be boxed.
object objRet = hello.Invoke(null, invokeArgs);
Console.WriteLine("hello.Invoke returned {0}", objRet);
}
}
Imports System.Reflection
Imports System.Reflection.Emit
Public Class Test
' Declare a delegate that will be used to execute the completed
' dynamic method.
Private Delegate Function HelloInvoker(ByVal msg As String, _
ByVal ret As Integer) As Integer
Public Shared Sub Main()
' Create an array that specifies the types of the parameters
' of the dynamic method. This method has a String parameter
' and an Integer parameter.
Dim helloArgs() As Type = {GetType(String), GetType(Integer)}
' 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 Test class.
Dim hello As New DynamicMethod("Hello", _
GetType(Integer), _
helloArgs, _
GetType(Test).Module)
' Create an array that specifies the parameter types of the
' overload of Console.WriteLine to be used in Hello.
Dim writeStringArgs() As Type = {GetType(String)}
' Get the overload of Console.WriteLine that has one
' String parameter.
Dim writeString As MethodInfo = GetType(Console). _
GetMethod("WriteLine", writeStringArgs)
' Get an ILGenerator and emit a body for the dynamic method.
Dim il As ILGenerator = hello.GetILGenerator()
' 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, Nothing)
' 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)
' Create a delegate that represents the dynamic method. This
' action completes the method, and any further attempts to
' change the method will cause an exception.
Dim hi As HelloInvoker = _
hello.CreateDelegate(GetType(HelloInvoker))
' Use the delegate to execute the dynamic method. Save and
' print the return value.
Dim retval As Integer = hi(vbCrLf & "Hello, World!", 42)
Console.WriteLine("Executing delegate hi(""Hello, World!"", 42) returned " _
& retval)
' Do it again, with different arguments.
retval = hi(vbCrLf & "Hi, Mom!", 5280)
Console.WriteLine("Executing delegate hi(""Hi, Mom!"", 5280) returned " _
& retval)
' Create an array of arguments to use with the Invoke method.
Dim invokeArgs() As Object = {vbCrLf & "Hello, 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 ValueType arguments
' must be boxed. Note that this overload of Invoke is
' inherited from MethodBase, and simply calls the more
' complete overload of Invoke.
Dim objRet As Object = hello.Invoke(Nothing, invokeArgs)
Console.WriteLine("hello.Invoke returned " & objRet)
End Sub
End Class
' This code example produces the following output:
'
'Hello, World!
'Executing delegate hi("Hello, World!", 42) returned 42
'
'Hi, Mom!
'Executing delegate hi("Hi, Mom!", 5280) returned 5280
'
'Hello, World!
'hello.Invoke returned 42
'
注釈
このコンストラクターは、メソッド属性 MethodAttributes.Public と 、 呼び出し MethodAttributes.Static規則 CallingConventions.Standardを指定し、Just-In-Time (JIT) の可視性チェックをスキップしません。
このコンストラクターで作成された動的メソッドは、モジュール m
に含まれるすべての型の public メンバーと internal
(Friend
Visual Basic では) メンバーにアクセスできます。
注意
下位互換性のために、次の条件が両方とも true のm
場合、このコンストラクターは フラグをSecurityPermissionFlag.ControlEvidence要求SecurityPermissionします。は呼び出し元モジュール以外のモジュールであり、 フラグを使用ReflectionPermissionFlag.MemberAccessした のReflectionPermission要求は失敗しました。 の要求 SecurityPermission が成功した場合、操作は許可されます。
こちらもご覧ください
適用対象
DynamicMethod(String, Type, Type[], Type)
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
メソッド名、戻り値の型、パラメーターの型、および動的メソッドが論理的に関連付けられる型を指定して、動的メソッドを作成します。
public:
DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, Type ^ owner);
public DynamicMethod (string name, Type? returnType, Type[]? parameterTypes, Type owner);
public DynamicMethod (string name, Type returnType, Type[] parameterTypes, Type owner);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * Type -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), owner As Type)
パラメーター
- name
- String
動的メソッドの名前。 これには長さ 0 の文字列も可能ですが、null
にすることはできません。
例外
parameterTypes
の要素が null
または Void です。
- または -
owner
がインターフェイス、配列、オープン ジェネリック型、またはジェネリック型またはメソッドの型パラメーターです。
.NET Framework バージョンと .NET Core バージョンが 2.1 より前の場合: returnType
は を返すIsByReftrue
型です。
例
次のコード例では、 DynamicMethod 型に論理的に関連付けられている を作成します。 この関連付けにより、その型のプライベート メンバーにアクセスできるようになります。
このコード例では、プライベート フィールドを使用して という名前Example
のクラス、最初のクラスから派生する という名前DerivedFromExample
のクラス、型と Int32のパラメーターを返Int32して持つ という名前UseLikeStatic
のデリゲート型Example
、および を返Int32し、型のパラメーターを 1 つ持つ という名前UseLikeInstance
のデリゲート型Int32を定義します。
次に、コード例では、 のインスタンスExample
のプライベート フィールドを変更し、前の値を返す を作成DynamicMethodします。
注意
一般に、クラスの内部フィールドを変更することは、オブジェクト指向のコーディングプラクティスとしては適していません。
コード例では、 の Example
インスタンスを作成し、次に 2 つのデリゲートを作成します。 1 つ目は 型 UseLikeStatic
で、動的メソッドと同じパラメーターを持っています。 2 つ目は 型 UseLikeInstance
で、最初のパラメーター (型 Example
) がありません。 このデリゲートは メソッド オーバーロードを CreateDelegate(Type, Object) 使用して作成されます。そのメソッド オーバーロードの 2 番目のパラメーターは の Example
インスタンスです。この場合、作成したインスタンスは、新しく作成されたデリゲートにバインドされます。 そのデリゲートが呼び出されるたびに、動的メソッドは のバインドされたインスタンス Example
に対して動作します。
注意
これは、メソッドの新しいオーバーロードと共に、.NET Framework 2.0 で導入されたデリゲート バインドの緩やかな規則のDelegate.CreateDelegate例です。 詳細については、Delegate クラスを参照してください。
UseLikeStatic
デリゲートが呼び出され、デリゲートにバインドされている のExample
インスタンスがUseLikeInstance
渡されます。 次に、両方の UseLikeInstance
デリゲートが の同じインスタンス Example
に対して動作するように、デリゲートが呼び出されます。 内部フィールドの値の変更は、各呼び出しの後に表示されます。 最後に、 UseLikeInstance
デリゲートが の DerivedFromExample
インスタンスにバインドされ、デリゲート呼び出しが繰り返されます。
using System;
using System.Reflection;
using System.Reflection.Emit;
// These classes are for demonstration purposes.
//
public class Example
{
private int id = 0;
public Example(int id)
{
this.id = id;
}
public int ID { get { return id; }}
}
public class DerivedFromExample : Example
{
public DerivedFromExample(int id) : base(id) {}
}
// Two delegates are declared: UseLikeInstance treats the dynamic
// method as if it were an instance method, and UseLikeStatic
// treats the dynamic method in the ordinary fashion.
//
public delegate int UseLikeInstance(int newID);
public delegate int UseLikeStatic(Example ex, int newID);
public class Demo
{
public static void Main()
{
// This dynamic method changes the private id field. It has
// no name; it returns the old id value (return type int);
// it takes two parameters, an instance of Example and
// an int that is the new value of id; and it is declared
// with Example as the owner type, so it can access all
// members, public and private.
//
DynamicMethod changeID = new DynamicMethod(
"",
typeof(int),
new Type[] { typeof(Example), typeof(int) },
typeof(Example)
);
// Get a FieldInfo for the private field 'id'.
FieldInfo fid = typeof(Example).GetField(
"id",
BindingFlags.NonPublic | BindingFlags.Instance
);
ILGenerator ilg = changeID.GetILGenerator();
// Push the current value of the id field onto the
// evaluation stack. It's an instance field, so load the
// instance of Example before accessing the field.
ilg.Emit(OpCodes.Ldarg_0);
ilg.Emit(OpCodes.Ldfld, fid);
// Load the instance of Example again, load the new value
// of id, and store the new field value.
ilg.Emit(OpCodes.Ldarg_0);
ilg.Emit(OpCodes.Ldarg_1);
ilg.Emit(OpCodes.Stfld, fid);
// The original value of the id field is now the only
// thing on the stack, so return from the call.
ilg.Emit(OpCodes.Ret);
// Create a delegate that uses changeID in the ordinary
// way, as a static method that takes an instance of
// Example and an int.
//
UseLikeStatic uls =
(UseLikeStatic) changeID.CreateDelegate(
typeof(UseLikeStatic)
);
// Create an instance of Example with an id of 42.
//
Example ex = new Example(42);
// Create a delegate that is bound to the instance of
// of Example. This is possible because the first
// parameter of changeID is of type Example. The
// delegate has all the parameters of changeID except
// the first.
UseLikeInstance uli =
(UseLikeInstance) changeID.CreateDelegate(
typeof(UseLikeInstance),
ex
);
// First, change the value of id by calling changeID as
// a static method, passing in the instance of Example.
//
Console.WriteLine(
"Change the value of id; previous value: {0}",
uls(ex, 1492)
);
// Change the value of id again using the delegate bound
// to the instance of Example.
//
Console.WriteLine(
"Change the value of id; previous value: {0}",
uli(2700)
);
Console.WriteLine("Final value of id: {0}", ex.ID);
// Now repeat the process with a class that derives
// from Example.
//
DerivedFromExample dfex = new DerivedFromExample(71);
uli = (UseLikeInstance) changeID.CreateDelegate(
typeof(UseLikeInstance),
dfex
);
Console.WriteLine(
"Change the value of id; previous value: {0}",
uls(dfex, 73)
);
Console.WriteLine(
"Change the value of id; previous value: {0}",
uli(79)
);
Console.WriteLine("Final value of id: {0}", dfex.ID);
}
}
/* This code example produces the following output:
Change the value of id; previous value: 42
Change the value of id; previous value: 1492
Final value of id: 2700
Change the value of id; previous value: 71
Change the value of id; previous value: 73
Final value of id: 79
*/
Imports System.Reflection
Imports System.Reflection.Emit
' These classes are for demonstration purposes.
'
Public Class Example
Private _id As Integer = 0
Public Sub New(ByVal newId As Integer)
_id = newId
End Sub
Public ReadOnly Property ID() As Integer
Get
Return _id
End Get
End Property
End Class
Public Class DerivedFromExample
Inherits Example
Public Sub New(ByVal newId As Integer)
MyBase.New(newId)
End Sub
End Class
' Two delegates are declared: UseLikeInstance treats the dynamic
' method as if it were an instance method, and UseLikeStatic
' treats the dynamic method in the ordinary fashion.
'
Public Delegate Function UseLikeInstance(ByVal newID As Integer) _
As Integer
Public Delegate Function UseLikeStatic(ByVal ex As Example, _
ByVal newID As Integer) As Integer
Public Class Demo
Public Shared Sub Main()
' This dynamic method changes the private _id field. It
' has no name; it returns the old _id value (return type
' Integer); it takes two parameters, an instance of Example
' and an Integer that is the new value of _id; and it is
' declared with Example as the owner type, so it can
' access all members, public and private.
'
Dim changeID As New DynamicMethod( _
"", _
GetType(Integer), _
New Type() {GetType(Example), GetType(Integer)}, _
GetType(Example) _
)
' Get a FieldInfo for the private field '_id'.
Dim fid As FieldInfo = GetType(Example).GetField( _
"_id", _
BindingFlags.NonPublic Or BindingFlags.Instance _
)
Dim ilg As ILGenerator = changeID.GetILGenerator()
' Push the current value of the id field onto the
' evaluation stack. It's an instance field, so load the
' instance of Example before accessing the field.
ilg.Emit(OpCodes.Ldarg_0)
ilg.Emit(OpCodes.Ldfld, fid)
' Load the instance of Example again, load the new value
' of id, and store the new field value.
ilg.Emit(OpCodes.Ldarg_0)
ilg.Emit(OpCodes.Ldarg_1)
ilg.Emit(OpCodes.Stfld, fid)
' The original value of the id field is now the only
' thing on the stack, so return from the call.
ilg.Emit(OpCodes.Ret)
' Create a delegate that uses changeID in the ordinary
' way, as a static method that takes an instance of
' Example and an Integer.
'
Dim uls As UseLikeStatic = CType( _
changeID.CreateDelegate(GetType(UseLikeStatic)), _
UseLikeStatic _
)
' Create an instance of Example with an id of 42.
'
Dim ex As New Example(42)
' Create a delegate that is bound to the instance of
' of Example. This is possible because the first
' parameter of changeID is of type Example. The
' delegate has all the parameters of changeID except
' the first.
Dim uli As UseLikeInstance = CType( _
changeID.CreateDelegate( _
GetType(UseLikeInstance), _
ex), _
UseLikeInstance _
)
' First, change the value of _id by calling changeID as
' a static method, passing in the instance of Example.
'
Console.WriteLine( _
"Change the value of _id; previous value: {0}", _
uls(ex, 1492) _
)
' Change the value of _id again using the delegate
' bound to the instance of Example.
'
Console.WriteLine( _
"Change the value of _id; previous value: {0}", _
uli(2700) _
)
Console.WriteLine("Final value of _id: {0}", ex.ID)
' Now repeat the process with a class that derives
' from Example.
'
Dim dfex As New DerivedFromExample(71)
uli = CType( _
changeID.CreateDelegate( _
GetType(UseLikeInstance), _
dfex), _
UseLikeInstance _
)
Console.WriteLine( _
"Change the value of _id; previous value: {0}", _
uls(dfex, 73) _
)
Console.WriteLine( _
"Change the value of _id; previous value: {0}", _
uli(79) _
)
Console.WriteLine("Final value of _id: {0}", dfex.ID)
End Sub
End Class
' This code example produces the following output:
'
'Change the value of _id; previous value: 42
'Change the value of _id; previous value: 1492
'Final value of _id: 2700
'Change the value of _id; previous value: 71
'Change the value of _id; previous value: 73
'Final value of _id: 79'
注釈
このコンストラクターで作成された動的メソッドは、 型のすべてのメンバー、および を含むowner
モジュール内の他のすべての型owner
の public メンバーおよび internal
(Friend
Visual Basic の場合) メンバーにアクセスできます。
このコンストラクターは、メソッド属性 MethodAttributes.Public と MethodAttributes.Static、呼び出し規約 CallingConventions.Standardを指定し、Just-In-Time (JIT) 可視性チェックをスキップしません。
注意
下位互換性のために、次の条件が両方とも true の場合、このコンストラクターは フラグをSecurityPermissionFlag.ControlEvidence要求SecurityPermissionします。owner
が呼び出し元モジュール以外のモジュール内にあり、 フラグを使用ReflectionPermissionFlag.MemberAccessした のReflectionPermission要求が失敗しました。 の要求 SecurityPermission が成功した場合、操作は許可されます。
こちらもご覧ください
適用対象
DynamicMethod(String, Type, Type[], Module, Boolean)
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
メソッド名、戻り値の型、パラメーターの型、モジュールを指定し、さらに Just-In-Time (JIT) 参照範囲チェックが動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーをスキップするかどうかを指定して、モジュールに対してグローバルな動的メソッドを作成します。
public:
DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, System::Reflection::Module ^ m, bool skipVisibility);
public DynamicMethod (string name, Type? returnType, Type[]? parameterTypes, System.Reflection.Module m, bool skipVisibility);
public DynamicMethod (string name, Type returnType, Type[] parameterTypes, System.Reflection.Module m, bool skipVisibility);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * System.Reflection.Module * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), m As Module, skipVisibility As Boolean)
パラメーター
- name
- String
動的メソッドの名前。 これには長さ 0 の文字列も可能ですが、null
にすることはできません。
- skipVisibility
- Boolean
動的メソッドの MSIL によりアクセスされる型とメンバーに対する JIT参照範囲チェックをスキップする場合は true
。
例外
.NET Framework バージョンと .NET Core バージョンが 2.1 より前の場合: returnType
は を返すIsByReftrue
型です。
注釈
このコンストラクターは、メソッド属性 MethodAttributes.Public と 、および MethodAttributes.Static呼び出し規約 CallingConventions.Standardを指定します。
このコンストラクターで作成された動的メソッドは、包含モジュール m
内のすべての型の public メンバーおよび internal
(Friend
Visual Basic では ) メンバーにアクセスできます。 JIT コンパイラの可視性チェックをスキップすると、動的メソッドは、他のすべての型のプライベート メンバーと保護されたメンバーにもアクセスできます。 これは、たとえば、オブジェクトをシリアル化するコードを記述する場合に便利です。
注意
下位互換性のために、次の条件が両方とも true の場合、このコンストラクターは フラグをSecurityPermissionFlag.ControlEvidence要求SecurityPermissionします。 m
が呼び出し元モジュール以外のモジュールであり、 フラグを使用ReflectionPermissionFlag.MemberAccessした のReflectionPermission要求が失敗しました。 の要求 SecurityPermission が成功した場合、操作は許可されます。
こちらもご覧ください
適用対象
DynamicMethod(String, Type, Type[], Type, Boolean)
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
メソッド名、戻り値の型、パラメーターの型、動的メソッドが論理的に関連付けられている型を指定し、さらに動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーに対する Just-In-Time (JIT) 参照範囲チェックをスキップするかどうかを指定して、動的メソッドを作成します。
public:
DynamicMethod(System::String ^ name, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, Type ^ owner, bool skipVisibility);
public DynamicMethod (string name, Type? returnType, Type[]? parameterTypes, Type owner, bool skipVisibility);
public DynamicMethod (string name, Type returnType, Type[] parameterTypes, Type owner, bool skipVisibility);
new System.Reflection.Emit.DynamicMethod : string * Type * Type[] * Type * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, returnType As Type, parameterTypes As Type(), owner As Type, skipVisibility As Boolean)
パラメーター
- name
- String
動的メソッドの名前。 これには長さ 0 の文字列も可能ですが、null
にすることはできません。
- skipVisibility
- Boolean
動的メソッドの MSIL によりアクセスされる型とメンバーに対する JIT 参照範囲チェックをスキップする場合は true
。それ以外の場合は false
。
例外
parameterTypes
の要素が null
または Void です。
- または -
owner
がインターフェイス、配列、オープン ジェネリック型、またはジェネリック型またはメソッドの型パラメーターです。
.NET Framework バージョンと .NET Core バージョンが 2.1 より前の場合: returnType
は を返すIsByReftrue
型です。
注釈
このコンストラクターで作成された動的メソッドは、 型のすべてのメンバー、および を含むowner
モジュール内の他のすべての型owner
の public メンバーおよび internal
(Friend
Visual Basic の場合) メンバーにアクセスできます。 JIT コンパイラの可視性チェックをスキップすると、動的メソッドは、他のすべての型のプライベート メンバーと保護されたメンバーにもアクセスできます。 これは、たとえば、オブジェクトをシリアル化するコードを記述する場合に便利です。
このコンストラクターは、メソッド属性 MethodAttributes.Public と 、および MethodAttributes.Static呼び出し規約 CallingConventions.Standardを指定します。
注意
下位互換性のために、次の条件が両方とも true の場合、このコンストラクターは フラグをSecurityPermissionFlag.ControlEvidence要求SecurityPermissionします。owner
が呼び出し元モジュール以外のモジュール内にあり、 フラグを使用ReflectionPermissionFlag.MemberAccessした のReflectionPermission要求が失敗しました。 の要求 SecurityPermission が成功した場合、操作は許可されます。
こちらもご覧ください
適用対象
DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Module, Boolean)
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
メソッド名、属性、呼び出し規約、戻り値の型、パラメーターの型、モジュールを指定し、さらに Just-In-Time (JIT) 参照範囲チェックが動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーをスキップするかどうかを指定して、動的メソッドを作成します。
public:
DynamicMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, System::Reflection::Module ^ m, bool skipVisibility);
public DynamicMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? parameterTypes, System.Reflection.Module m, bool skipVisibility);
public DynamicMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] parameterTypes, System.Reflection.Module m, bool skipVisibility);
new System.Reflection.Emit.DynamicMethod : string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] * System.Reflection.Module * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, attributes As MethodAttributes, callingConvention As CallingConventions, returnType As Type, parameterTypes As Type(), m As Module, skipVisibility As Boolean)
パラメーター
- name
- String
動的メソッドの名前。 これには長さ 0 の文字列も可能ですが、null
にすることはできません。
- attributes
- MethodAttributes
動的メソッドの属性を指定する、MethodAttributes 値のビットごとの組み合わせ。 使用できる組み合わせは Public と Static だけです。
- callingConvention
- CallingConventions
動的メソッドの呼び出し規則。 Standardである必要があります。
- skipVisibility
- Boolean
動的メソッドの MSIL によりアクセスされる型とメンバーに対する JIT 参照範囲チェックをスキップする場合は true
。それ以外の場合は false
。
例外
attributes
は、Public と Static 以外のフラグの組み合わせです。
- または -
callingConvention
が Standard ではありません。
- または -
returnType
は、IsByRef が true
を返す型です。
注釈
このコンストラクターで作成された動的メソッドは、モジュール m
に含まれるすべてのパブリック型と内部型の public メンバーおよび internal
(Friend
Visual Basic では ) メンバーにアクセスできます。
JIT コンパイラの可視性チェックをスキップすると、動的メソッドは、モジュールおよび他のすべてのアセンブリ内の他のすべての型のプライベートメンバーと保護されたメンバーにアクセスできます。 これは、たとえば、オブジェクトをシリアル化するコードを記述する場合に便利です。
注意
下位互換性のために、次の条件が両方とも true の場合、このコンストラクターは フラグをSecurityPermissionFlag.ControlEvidence要求SecurityPermissionします。 m
が呼び出し元モジュール以外のモジュールであり、 フラグを使用ReflectionPermissionFlag.MemberAccessした のReflectionPermission要求が失敗しました。 の要求 SecurityPermission が成功した場合、操作は許可されます。
こちらもご覧ください
適用対象
DynamicMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type, Boolean)
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
- ソース:
- DynamicMethod.cs
メソッド名、属性、呼び出し規則、戻り値の型、パラメーターの型、動的メソッドが論理的に関連付けられている型を指定し、さらに Just-In-Time (JIT) 参照範囲チェックが動的メソッドの Microsoft Intermediate Language (MSIL) によりアクセスされる型やメンバーをスキップするかどうかを指定して、動的メソッドを作成します。
public:
DynamicMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention, Type ^ returnType, cli::array <Type ^> ^ parameterTypes, Type ^ owner, bool skipVisibility);
public DynamicMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? parameterTypes, Type owner, bool skipVisibility);
public DynamicMethod (string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Type owner, bool skipVisibility);
new System.Reflection.Emit.DynamicMethod : string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] * Type * bool -> System.Reflection.Emit.DynamicMethod
Public Sub New (name As String, attributes As MethodAttributes, callingConvention As CallingConventions, returnType As Type, parameterTypes As Type(), owner As Type, skipVisibility As Boolean)
パラメーター
- name
- String
動的メソッドの名前。 これには長さ 0 の文字列も可能ですが、null
にすることはできません。
- attributes
- MethodAttributes
動的メソッドの属性を指定する、MethodAttributes 値のビットごとの組み合わせ。 使用できる組み合わせは Public と Static だけです。
- callingConvention
- CallingConventions
動的メソッドの呼び出し規則。 Standardである必要があります。
- skipVisibility
- Boolean
動的メソッドの MSIL によりアクセスされる型とメンバーに対する JIT 参照範囲チェックをスキップする場合は true
。それ以外の場合は false
。
例外
parameterTypes
の要素が null
または Void です。
- または -
owner
がインターフェイス、配列、オープン ジェネリック型、またはジェネリック型またはメソッドの型パラメーターです。
attributes
は、Public と Static 以外のフラグの組み合わせです。
- または -
callingConvention
が Standard ではありません。
- または -
returnType
は、IsByRef が true
を返す型です。
注釈
動的メソッドは、 型 owner
を含むモジュールに対してグローバルです。 型のすべてのメンバーにアクセスできます owner
。
このコンストラクターで作成された動的メソッドは、 型のすべてのメンバー、および を含むowner
モジュールに含まれるすべての型owner
の public メンバーおよび internal
(Friend
Visual Basic の場合) メンバーにアクセスできます。 JIT コンパイラの可視性チェックをスキップすると、動的メソッドは、他のすべての型のプライベート メンバーと保護されたメンバーにもアクセスできます。 これは、たとえば、オブジェクトをシリアル化するコードを記述する場合に便利です。
注意
下位互換性のために、次の条件が両方とも true の場合、このコンストラクターは フラグをSecurityPermissionFlag.ControlEvidence要求SecurityPermissionします。owner
が呼び出し元モジュール以外のモジュール内にあり、 フラグを使用ReflectionPermissionFlag.MemberAccessした のReflectionPermission要求が失敗しました。 の要求 SecurityPermission が成功した場合、操作は許可されます。
こちらもご覧ください
適用対象
.NET