Mono Internals
	This section documents some of the internal APIs used
	inside Mono that developers extending or altering Mono might
	want to use.
Strings
Other Encodings
	These routines are used when coping with strings that come
	from Mono's environment, and might be encoded in one or more
	of the external encodings.
	
For example, some file systems might historically contain a
	mix of file names with both old and new encodings, typically
	UTF8 for new files, and the old files would be encoded in an 8
	bit character set (ISO-8859-1 for example).
	
	
These routines try a number of encodings, those specified
	in the 
MONO_ENCODINGS environment variable and return
	unicode strings that can be used internally.
	
See the mono(1) man page for more details.
	
    mono_unicode_from_external
    
        
        
            
            Syntax
            gunichar2*mono_unicode_from_external (const gchar *in, gsize *bytes)
            
            Parameters
            | in | pointers to the buffer. | 
| bytes | number of bytes in the string. | 
             Description
             
 Tries to turn a 
NULL-terminated string into UTF-16.
 First, see if it's valid UTF-8, in which case just turn it directly
 into UTF-16.  Next, run through the colon-separated encodings in
 
MONO_EXTERNAL_ENCODINGS and do an 
iconv conversion on each,
 returning the first successful conversion to UTF-16.  If no
 conversion succeeds, return 
NULL.
 Callers must free the returned string if not 
NULL. 
bytes holds the number
 of bytes in the returned string, not including the terminator.
 
     
  
    mono_unicode_to_external
    
        
        
            
            Syntax
            gchar*mono_unicode_to_external (const gunichar2 *uni)
            
            Parameters
            | uni | a UTF-16 string to convert to an external representation. | 
             Description
             
 Turns NULL-terminated UTF-16 into either UTF-8, or the first
 working item in MONO_EXTERNAL_ENCODINGS if set.  If no conversions
 work, then UTF-8 is returned.
 Callers must free the returned string.
         
     
  
    mono_utf8_from_external
    
        
        
            
            Syntax
            gchar*mono_utf8_from_external (const gchar *in)
            
            Parameters
            | in | pointer to the string buffer. | 
             Description
             
 Tries to turn a 
NULL-terminated string into UTF8.
 First, see if it's valid UTF-8, in which case there's nothing more
 to be done.  Next, run through the colon-separated encodings in
 
MONO_EXTERNAL_ENCODINGS and do an 
iconv conversion on each,
 returning the first successful conversion to UTF-8.  If no
 conversion succeeds, return 
NULL.
 Callers must free the returned string if not 
NULL.
 This function is identical to 
mono_unicode_from_external, apart
 from returning UTF-8 not UTF-16; it's handy in a few places to work
 in UTF-8.
 
     
Marshalling functions
  
    mono_marshal_alloc
    
        
        
            
            Syntax
            void*
mono_marshal_alloc (gsize size, MonoError *error)
            
         
     
  
    mono_marshal_asany
    
        
        
            
            Syntax
            gpointer
mono_marshal_asany_impl (MonoObjectHandle o, MonoMarshalNative string_encoding, int param_attrs, MonoError *error)
            
             Description
             
 This is a JIT icall, it sets the pending exception (in wrapper) and returns NULL on error.
         
     
  
    mono_marshal_free_array
    
        
        
            
            Syntax
            void
mono_marshal_free_array (gpointer *ptr, int size) 
            
         
     
  
    mono_marshal_free_asany
    
        
        
            
            Syntax
            void
mono_marshal_free_asany_impl (MonoObjectHandle o, gpointer ptr, MonoMarshalNative string_encoding, int param_attrs, MonoError *error)
            
             Description
             
 This is a JIT icall, it sets the pending exception (in wrapper)
         
     
  
    mono_marshal_free
    
        
        
            
            Syntax
            void
mono_marshal_free (gpointer ptr)
            
         
     
  
    mono_marshal_get_castclass
    
        
        
            
            Syntax
            mono_marshal_get_castclass
            
         
     
  
    mono_marshal_get_delegate_begin_invoke
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_delegate_begin_invoke (MonoMethod *method)
            
         
     
  
    mono_marshal_get_delegate_end_invoke
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_delegate_end_invoke (MonoMethod *method)
            
         
     
  
    mono_marshal_get_delegate_invoke
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_delegate_invoke (MonoMethod *method, MonoDelegate *del)
            
             Description
             
 The returned method invokes all methods in a multicast delegate.
         
     
  
    mono_marshal_get_icall_wrapper
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_icall_wrapper (MonoJitICallInfo *callinfo, gboolean check_exceptions)
            
             Description
             
 Generates IL code for the JIT icall wrapper. The generated method
 calls the unmanaged code in callinfo->func.
         
     
  
    mono_marshal_get_isinst
    
        
        
            
            Syntax
            mono_marshal_get_isinst
            
         
     
  
    mono_marshal_get_ldfld_wrapper
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_ldfld_wrapper (MonoType *type)
            
            Parameters
            | type | the type of the field | 
             Description
             
 This method generates a function which can be use to load a field with type
 
type from an object. The generated function has the following signature:
 type ldfld_wrapper (MonoObject *this_obj, MonoClass *klass, MonoClassField *field, int offset) 
         
     
  
    mono_marshal_get_managed_wrapper
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_managed_wrapper (MonoMethod *method, MonoClass *delegate_klass, uint32_t target_handle, MonoError *error)
            
             Description
             
 Generates IL code to call managed methods from unmanaged code 
 If target_handle is 0, the wrapper info will be a WrapperInfo structure.
         
     
  
    mono_marshal_get_native_wrapper
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_native_wrapper (MonoMethod *method, gboolean check_exceptions, gboolean aot)
            
            Parameters
            | method | The MonoMethodto wrap. | 
| check_exceptions | Whenever to check for pending exceptions | 
             Description
             
 Generates IL code for the pinvoke wrapper. The generated method
 calls the unmanaged code in 
piinfo->addr.
 
         
     
  
    mono_marshal_get_proxy_cancast
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_proxy_cancast (MonoClass *klass)
            
         
     
  
    mono_marshal_get_ptr_to_struct
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_ptr_to_struct (MonoClass *klass)
            
            Parameters
                         Description
             
 Generates IL code for PtrToStructure (IntPtr src, object structure)
         
     
  
    mono_marshal_get_remoting_invoke_for_target
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_remoting_invoke_for_target (MonoMethod *method, MonoRemotingTarget target_type, MonoError *error)
            
         
     
  
    mono_marshal_get_remoting_invoke
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_remoting_invoke (MonoMethod *method, MonoError *error)
            
         
     
  
    mono_marshal_get_remoting_invoke_with_check
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_remoting_invoke_with_check (MonoMethod *method, MonoError *error)
            
         
     
  
    mono_marshal_get_runtime_invoke
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_runtime_invoke_full (MonoMethod *method, gboolean virtual_, gboolean need_direct_wrapper)
            
            Parameters
                         Description
             
 MonoObject *runtime_invoke (MonoObject *this_obj, void **params, MonoObject **exc, void* method)
 We also catch exceptions if 
exc is not 
NULL.
 If 
virtual is 
TRUE, then 
method is invoked virtually on 
this. This is useful since
 it means that the compiled code for 
method does not have to be looked up 
 before calling the runtime invoke wrapper. In this case, the wrapper ignores
 its 
method argument.
 
         
     
  
    mono_marshal_get_stelemref
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_stelemref (void)
            
         
     
  
    mono_marshal_get_stfld_wrapper
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_stfld_wrapper (MonoType *type)
            
            Parameters
            | type | the type of the field | 
             Description
             
 This method generates a function which can be use to store a field with type
 
type. The generated function has the following signature:
 void stfld_wrapper (MonoObject *this_obj, MonoClass *klass, MonoClassField *field, int offset, type val) 
         
     
  
    mono_marshal_get_struct_to_ptr
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_struct_to_ptr (MonoClass *klass)
            
            Parameters
                         Description
             
 Generates IL code for 
StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld) 
         
     
  
    mono_marshal_get_synchronized_wrapper
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_synchronized_wrapper (MonoMethod *method)
            
            Parameters
            | wrapper | the generated method | 
             Description
             
 calls method while locking this or the parent type.
         
     
  
    mono_marshal_get_unbox_wrapper
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_unbox_wrapper (MonoMethod *method)
            
             Description
             
 The returned method calls method unboxing the this argument.
         
     
  
    mono_marshal_get_xappdomain_invoke
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_get_xappdomain_invoke (MonoMethod *method, MonoError *error)
            
             Description
             
 Generates a fast remoting wrapper for cross app domain calls.
         
     
  
    mono_marshal_load_type_info
    
        
        
            
            Syntax
            MonoMarshalType*
mono_marshal_load_type_info (MonoClass* klass)
            
             Description
             
 Initialize 
klass::marshal_info using information from metadata. This function can
 recursively call itself, and the caller is responsible to avoid that by calling 
 
mono_marshal_is_loading_type_info beforehand.
 LOCKING: Acquires the loader lock.
 
         
     
  
    mono_marshal_method_from_wrapper
    
        
        
            
            Syntax
            MonoMethod*
mono_marshal_method_from_wrapper (MonoMethod *wrapper)
            
         
     
  
    mono_marshal_set_last_error
    
        
        
            
            Syntax
            void
mono_marshal_set_last_error (void)
            
             Description
             
 This function is invoked to set the last error value from a P/Invoke call
 which has 
SetLastError set.
 
         
     
  
    mono_marshal_type_size
    
        
        
            
            Syntax
            gint32
mono_marshal_type_size (MonoType *type, MonoMarshalSpec *mspec, guint32 *align,
			gboolean as_field, gboolean unicode)
            
         
     
Metadata Loader Locking: Internals
	The locking functions here are used by code in class.c and
	metadata.c to lock access to the shared hashtables inside the
	MonoImage.
	
  
    mono_loader_lock
    
        
        
            
            Syntax
            void
mono_loader_lock (void)
            
             Description
             
 See 
docs/thread-safety.txt for the locking strategy.
 
         
     
  
    mono_loader_unlock
    
        
        
            
            Syntax
            void
mono_loader_unlock (void)
            
         
     
Garbage Collector Internal Interface
	The internal interface of the Mono GC is the interface used
	between the runtime engine and the garbage collector.
	
  
    mono_gc_alloc_fixed
    
        
        
            
            Syntax
            MonoObject*
mono_gc_alloc_fixed (size_t size, MonoGCDescriptor descr, MonoGCRootSource source, void *key, const char *msg)
            
         
     
  
    mono_gc_free_fixed
    
        
        
            
            Syntax
            void
mono_gc_free_fixed (void* addr)
            
         
     
  
    mono_gc_make_descr_from_bitmap
    
        
        
            
            Syntax
            SgenDescriptor
mono_gc_make_descr_from_bitmap (gsize *bitmap, int numbits)
            
         
     
  
    mono_gc_base_init
    
        
        
            
            Syntax
            void
mono_gc_base_init (void)
            
         
     
  
    mono_gc_invoke_finalizers
    
        
        
            
            Syntax
            int
mono_gc_invoke_finalizers (void)
            
         
     
  
    mono_gc_is_gc_thread
    
        
        
            
            Syntax
            gboolean
mono_gc_is_gc_thread (void)
            
         
     
  
    mono_gc_pending_finalizers
    
        
        
            
            Syntax
            MonoBoolean
mono_gc_pending_finalizers (void)
            
         
     
  
    mono_gc_register_thread
    
        
        
            
            Syntax
            mono_gc_register_thread