DynamicMethod Class

The DynamicMethod class provides a way to create a method at runtime with a custom signature and implementation. It can be used for emitting IL directly, creating lightweight delegates, or defining methods that can be attached to a type.

Namespace

System.Reflection.Emit

Assembly

mscorlib.dll

Syntax

public sealed class DynamicMethod : MethodInfo

Constructors

SignatureDescription
DynamicMethod(string name, Type returnType, Type[] parameterTypes) Creates a dynamic method with the specified name, return type, and parameter types. The method is private to the defining assembly.
DynamicMethod(string name, Type returnType, Type[] parameterTypes, Type owner) Associates the dynamic method with a specific owner type, allowing access to its private members.
DynamicMethod(string name, Type returnType, Type[] parameterTypes, Module m) Creates the method in the context of a particular module.
DynamicMethod(string name, Type returnType, Type[] parameterTypes, Module m, bool skipVisibility) Specifies whether the dynamic method can bypass visibility checks.

Key Members

MemberSignatureDescription
GetILGenerator ILGenerator GetILGenerator() Returns an ILGenerator to emit the method's body.
CreateDelegate Delegate CreateDelegate(Type delegateType) Creates a delegate of the specified type that represents the dynamic method.
Invoke object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture) Invokes the dynamic method directly.
InitLocals bool InitLocals { get; set; } Gets or sets whether the local variables are automatically zero-initialized.

Example

// Create a dynamic method that adds two integers
var dm = new DynamicMethod(
    "Add",
    typeof(int),
    new[] { typeof(int), typeof(int) },
    typeof(Program).Module);

ILGenerator il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);      // Load first argument
il.Emit(OpCodes.Ldarg_1);      // Load second argument
il.Emit(OpCodes.Add);          // Add them
il.Emit(OpCodes.Ret);          // Return result

var add = (Func<int, int, int>)dm.CreateDelegate(typeof(Func<int, int, int>));
Console.WriteLine(add(5, 7)); // Output: 12

Remarks

Dynamic methods are emitted in-memory and do not require a physical assembly on disk. They are ideal for scenarios where performance-critical code needs to be generated at runtime, such as serialization, LINQ providers, or dynamic proxies.

When using skipVisibility, be aware of security implications, as it can grant access to private members.