| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- <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_create_method">mono_mb_create_method</a></h4>
- <h4><a name="api:mono_mb_emit_add_to_local">mono_mb_emit_add_to_local</a></h4>
- <h4><a name="api:mono_mb_emit_branch">mono_mb_emit_branch</a></h4>
- <h4><a name="api:mono_mb_emit_byte">mono_mb_emit_byte</a></h4>
- <h4><a name="api:mono_mb_emit_exception">mono_mb_emit_exception</a></h4>
- <h4><a name="api:mono_mb_emit_i2">mono_mb_emit_i2</a></h4>
- <h4><a name="api:mono_mb_emit_i4">mono_mb_emit_i4</a></h4>
- <h4><a name="api:mono_mb_emit_icon">mono_mb_emit_icon</a></h4>
- <h4><a name="api:mono_mb_emit_ldarg_addr">mono_mb_emit_ldarg_addr</a></h4>
- <h4><a name="api:mono_mb_emit_ldarg">mono_mb_emit_ldarg</a></h4>
- <h4><a name="api:mono_mb_emit_ldflda">mono_mb_emit_ldflda</a></h4>
- <h4><a name="api:mono_mb_emit_ldloc_addr">mono_mb_emit_ldloc_addr</a></h4>
- <h4><a name="api:mono_mb_emit_ldloc">mono_mb_emit_ldloc</a></h4>
- <h4><a name="api:mono_mb_emit_ldstr">mono_mb_emit_ldstr</a></h4>
- <h4><a name="api:mono_mb_emit_managed_call">mono_mb_emit_managed_call</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_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>
|