-<h3>Dynamic Code Generation</h3>
+<h2>Dynamic Code Generation</h2>
+
+ <p>The dynamic code generation interface inside the Mono
+ runtime is similar to the API exposed by
+ System.Reflection.Emit.
+
+ <p>This interface is used by Mono internally to generate code
+ on the flight in a cross-platform fashion. For example,
+ P/Invoke marshalling in Mono is implemented in terms of this
+ interface, but it is also used in various other parts of the
+ runtime.
+
+ <p>Unlike Reflection.Emit, the dynamic code generation
+ interface does not start with an assembly builder. The code
+ generation interface starts directly at the method level,
+ which is represented by a pointer to the MonoMethodBuilder
+ structure.
+
+ <p>To JIT this method, the process is this:
+
+ <ul>
+ <li>Create a <tt>MonoMethodBuilder</tt> object using
+ the <tt>mono_mb_new</tt> method. The method's class
+ is specified as the first argument.
+
+ <li>Create the method signature, using
+ <tt>mono_metadata_signature_alloc</tt>. The call
+ takes the number of arguments that the method takes.
+ Then you must initialize the types for each one of the
+ parameters.
+
+ <li>Emit the CIL code, using one of the
+ <tt>mono_mb_emit_*</tt> functions. There are some
+ helper routines that you can use.
+
+ <li>Create the <tt>MonoMethod</tt> from the
+ <tt>MethodBuilder</tt> using
+ <tt>mono_mb_create_method</tt>.
+
+ <li>Release the <tt>MonoMethodBuilder</tt> resources
+ using mono_mb_free.
+ </ul>
+
+ <p>The result of this process is a <tt>MonoMethod</tt> which
+ can be called using <tt><a
+ href="api:mono_create_jit_trampoline">mono_create_jit_trampoline</a></tt>
+ routine or can be passed to any other functions that require
+ the MonoMethod.
+
+ <p>Example:
+
+ <pre>
+MonoMethod *adder ()
+{
+ MonoMethodBuilder *mb;
+ MonoMethodSignature *sig;
+ MonoMethod *method;
+
+ mb = mono_mb_new (mono_defaults.object_class, "adder", MONO_WRAPPER_NONE);
+
+ /* Setup method signature */
+ sig = mono_metadata_signature_alloc (2);
+ sig->ret = &mono_get_int32_class ()->byval_arg;
+ sig->params [0] = &mono_get_int32_class ()->byval_arg;
+ sig->params [1] = &mono_defaults.int32_class->byval_arg;
+
+ /* Emit CIL code */
+ mono_mb_emit_ldarg (mb, 0);
+ mono_mb_emit_ldarg (mb, 1);
+ mono_mb_emit_byte (mb, CEE_ADD);
+ mono_mb_emit_byte (mb, CEE_RET);
+
+ /* Get the method */
+ method = mono_mb_create_method (mb, sig, max_stack);
+
+ /* Cleanup */
+ mono_mb-free (mb);
+ return method;
+}
+ </pre>
+
+<h4><a name="api:mono_mb_new">mono_mb_new</a></h4>
+
+ <p>The possible values for the <i>type</i> argument are:
+
+<pre>
+ MONO_WRAPPER_NONE
+ MONO_WRAPPER_DELEGATE_INVOKE
+ MONO_WRAPPER_DELEGATE_BEGIN_INVOKE
+ MONO_WRAPPER_DELEGATE_END_INVOKE
+ MONO_WRAPPER_RUNTIME_INVOKE
+ MONO_WRAPPER_NATIVE_TO_MANAGED
+ MONO_WRAPPER_MANAGED_TO_NATIVE
+ MONO_WRAPPER_REMOTING_INVOKE
+ MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK
+ MONO_WRAPPER_XDOMAIN_INVOKE
+ MONO_WRAPPER_XDOMAIN_DISPATCH
+ MONO_WRAPPER_LDFLD
+ MONO_WRAPPER_STFLD
+ MONO_WRAPPER_LDFLD_REMOTE
+ MONO_WRAPPER_STFLD_REMOTE
+ MONO_WRAPPER_SYNCHRONIZED
+ MONO_WRAPPER_DYNAMIC_METHOD
+ MONO_WRAPPER_ISINST
+ MONO_WRAPPER_CASTCLASS
+ MONO_WRAPPER_PROXY_ISINST
+ MONO_WRAPPER_STELEMREF
+ MONO_WRAPPER_UNBOX
+ MONO_WRAPPER_LDFLDA
+ MONO_WRAPPER_UNKNOWN
+</pre>
<h4><a name="api:mono_mb_add_data">mono_mb_add_data</a></h4>
<h4><a name="api:mono_mb_add_local">mono_mb_add_local</a></h4>
<h4><a name="api:mono_mb_emit_native_call">mono_mb_emit_native_call</a></h4>
<h4><a name="api:mono_mb_emit_stloc">mono_mb_emit_stloc</a></h4>
<h4><a name="api:mono_mb_free">mono_mb_free</a></h4>
-<h4><a name="api:mono_mb_new">mono_mb_new</a></h4>
+
<h4><a name="api:mono_mb_patch_addr">mono_mb_patch_addr</a></h4>
<h4><a name="api:mono_mb_patch_addr_s">mono_mb_patch_addr_s</a></h4>
+
+<h4><a name="api:mono_metadata_signature_alloc">mono_metadata_signature_alloc</a></h4>
+<h4><a name="api:mono_metadata_signature_dup">mono_metadata_signature_dup</a></h4>
+<h4><a name="api:mono_metadata_signature_equal">mono_metadata_signature_equal</a></h4>
-<h3>Control Flow Graph</h3>
-
-<h4><a name="api:mini_method_compile">mini_method_compile</a></h4>
-<h4><a name="api:mono_destroy_compile">mono_destroy_compile</a></h4>