<h1>Mono Internals</h1> <p>This section documents some of the internal APIs used inside Mono that developers extending or altering Mono might want to use. <h2>Marshalling functions</h2> <h4><a name="api:mono_marshal_alloc">mono_marshal_alloc</a></h4> <h4><a name="api:mono_marshal_asany">mono_marshal_asany</a></h4> <h4><a name="api:mono_marshal_free_array">mono_marshal_free_array</a></h4> <h4><a name="api:mono_marshal_free_asany">mono_marshal_free_asany</a></h4> <h4><a name="api:mono_marshal_free">mono_marshal_free</a></h4> <h4><a name="api:mono_marshal_get_castclass">mono_marshal_get_castclass</a></h4> <h4><a name="api:mono_marshal_get_delegate_begin_invoke">mono_marshal_get_delegate_begin_invoke</a></h4> <h4><a name="api:mono_marshal_get_delegate_end_invoke">mono_marshal_get_delegate_end_invoke</a></h4> <h4><a name="api:mono_marshal_get_delegate_invoke">mono_marshal_get_delegate_invoke</a></h4> <h4><a name="api:mono_marshal_get_icall_wrapper">mono_marshal_get_icall_wrapper</a></h4> <h4><a name="api:mono_marshal_get_isinst">mono_marshal_get_isinst</a></h4> <h4><a name="api:mono_marshal_get_ldfld_remote_wrapper">mono_marshal_get_ldfld_remote_wrapper</a></h4> <h4><a name="api:mono_marshal_get_ldfld_wrapper">mono_marshal_get_ldfld_wrapper</a></h4> <h4><a name="api:mono_marshal_get_managed_wrapper">mono_marshal_get_managed_wrapper</a></h4> <h4><a name="api:mono_marshal_get_native_wrapper">mono_marshal_get_native_wrapper</a></h4> <h4><a name="api:mono_marshal_get_proxy_cancast">mono_marshal_get_proxy_cancast</a></h4> <h4><a name="api:mono_marshal_get_ptr_to_struct">mono_marshal_get_ptr_to_struct</a></h4> <h4><a name="api:mono_marshal_get_remoting_invoke_for_target">mono_marshal_get_remoting_invoke_for_target</a></h4> <h4><a name="api:mono_marshal_get_remoting_invoke">mono_marshal_get_remoting_invoke</a></h4> <h4><a name="api:mono_marshal_get_remoting_invoke_with_check">mono_marshal_get_remoting_invoke_with_check</a></h4> <h4><a name="api:mono_marshal_get_runtime_invoke">mono_marshal_get_runtime_invoke</a></h4> <h4><a name="api:mono_marshal_get_stelemref">mono_marshal_get_stelemref</a></h4> <h4><a name="api:mono_marshal_get_stfld_remote_wrapper">mono_marshal_get_stfld_remote_wrapper</a></h4> <h4><a name="api:mono_marshal_get_stfld_wrapper">mono_marshal_get_stfld_wrapper</a></h4> <h4><a name="api:mono_marshal_get_struct_to_ptr">mono_marshal_get_struct_to_ptr</a></h4> <h4><a name="api:mono_marshal_get_synchronized_wrapper">mono_marshal_get_synchronized_wrapper</a></h4> <h4><a name="api:mono_marshal_get_unbox_wrapper">mono_marshal_get_unbox_wrapper</a></h4> <h4><a name="api:mono_marshal_get_xappdomain_invoke">mono_marshal_get_xappdomain_invoke</a></h4> <h4><a name="api:mono_marshal_load_type_info">mono_marshal_load_type_info</a></h4> <h4><a name="api:mono_marshal_method_from_wrapper">mono_marshal_method_from_wrapper</a></h4> <h4><a name="api:mono_marshal_realloc">mono_marshal_realloc</a></h4> <h4><a name="api:mono_marshal_set_last_error">mono_marshal_set_last_error</a></h4> <h4><a name="api:mono_marshal_type_size">mono_marshal_type_size</a></h4> <h2>Metadata Loading Errors</h2> <p>The routines in this section are used to cope with errors during metadata loading. Errors in metadata handling can happen for many reason, and these include (this is not an exhaustive list). <ul> <li>An assembly referenced is missing. <li>Fields referenced are missing. <li>Methods referenced are missing. </ul> <p>The <tt>mono_loader_set_*</tt> routines are invoked during metadata loading to flag that an error has happened. The class loading errros are flagged in a per-thread basis. <P>In various spots in the runtime the <tt>mono_loader_get_last_error</tt> routine is called to check if there was a problem, and then errors are propagated upwards on the stack until we reach a point where an exception can be raised and no runtime locks are held. <p>The <tt>mono_loader_error_prepare_exception</tt> takes a <tt>MonoLoaderError</tt> structure (the value returned from <tt>mono_loader_get_last_error</tt>), turns that into an exception and clears the error condition from the current thread. <h4><a name="api:mono_loader_set_error_field_load">mono_loader_set_error_field_load</a></h4> <h4><a name="api:mono_loader_set_error_method_load">mono_loader_set_error_method_load</a></h4> <h4><a name="api:mono_loader_set_error_type_load">mono_loader_set_error_type_load</a></h4> <h4><a name="api:mono_loader_get_last_error">mono_loader_get_last_error</a></h4> <h4><a name="api:mono_loader_clear_error">mono_loader_clear_error</a></h4> <h4><a name="api:mono_loader_error_prepare_exception">mono_loader_error_prepare_exception</a></h4> <h2>Metadata Loader Locking: Internals</h2> <p>The locking functions here are used by code in class.c and metadata.c to lock access to the shared hashtables inside the MonoImage. <h4><a name="api:mono_loader_lock">mono_loader_lock</a></h4> <h4><a name="api:mono_loader_unlock">mono_loader_unlock</a></h4> <h2>Garbage Collector Internal Interface</h2> <p>The internal interface of the Mono GC is the interface used between the runtime engine and the garbage collector. <h4><a name="api:mono_gc_disable">mono_gc_disable</a></h4> <h4><a name="api:mono_gc_enable">mono_gc_enable</a></h4> <h4><a name="api:mono_gc_is_finalizer_thread">mono_gc_is_finalizer_thread</a></h4> <h4><a name="api:mono_gc_out_of_memory">mono_gc_out_of_memory</a></h4> <h4><a name="api:mono_gc_start_world">mono_gc_start_world</a></h4> <h4><a name="api:mono_gc_stop_world">mono_gc_stop_world</a></h4> <h4><a name="api:mono_gc_alloc_fixed">mono_gc_alloc_fixed</a></h4> <h4><a name="api:mono_gc_enable_events">mono_gc_enable_events</a></h4> <h4><a name="api:mono_gc_free_fixed">mono_gc_free_fixed</a></h4> <h4><a name="api:mono_gc_make_descr_from_bitmap">mono_gc_make_descr_from_bitmap</a></h4> <h4><a name="api:mono_gc_base_init">mono_gc_base_init</a></h4> <h4><a name="api:mono_gc_invoke_finalizers">mono_gc_invoke_finalizers</a></h4> <h4><a name="api:mono_gc_is_gc_thread">mono_gc_is_gc_thread</a></h4> <h4><a name="api:mono_gc_pending_finalizers">mono_gc_pending_finalizers</a></h4> <h4><a name="api:mono_gc_register_thread">mono_gc_register_thread</a></h4> <h4><a name="api:mono_gc_finalize_notify">mono_gc_finalize_notify</a></h4>