			 Internal Call Topics

* Introduction

	The Common Language Infrastructure allows for methods to be
	implemented in unmanaged code.  Unlike the Platform Invocation
	services which provide marshalling and unmarshalling of data
	from managed to unmanaged and viceversa the Internal calls do
	not perform any kind of marshalling.

* Basic Type mapping

	The following lists how the C# types are exposed to the C API.

	C# type 	C type
	-----------------------------
	char 		gunichar2
	bool 		MonoBoolean
	sbyte 		signed char
	byte 		guchar
	short 		gint16
	ushort 		guint16
	int 		gint32
	uint 		guint32
	long 		gint64
	ulong 		guint64
	IntPtr/UIntPtr	gpointer
	object 		MonoObject*
	string 		MonoString*

* Pointers

	For ref and out paramaters you'll use the corresponding
	pointer type.

	So if you have a C# type listed as "ref int", you should use
	"int *" in your implementation.

* Arrays

	Arrays of any type must be described with a MonoArray* and the
	elements must be accessed with the mono_array_* macros.

* Other Structures

	Any other type that has a matching C structure representation,
	should use a pointer to the struct instead of a generic
	MonoObject pointer.

* Instance Methods.

	Instance methods that are internal calls will receive as first argument
	the instance object, so you must account for it in the C method signature:

		[MethodImplAttribute(MethodImplOptions.InternalCall)]
		public extern override int GetHashCode ();

	becomes:

		gint32 ves_icall_System_String_GetHashCode (MonoString *this);

* How to hook internal calls with the runtime

	Once you require an internal call in corlib, you need to
	create a C implementation for it and register it in a
	table in metadata/icall-def.h. See the top of that file
	for more information.
	
	If there are overloaded methods, you need also to
	specify the signature of _all_ of them:
	
		[MethodImplAttribute(MethodImplOptions.InternalCall)]
		public extern override void DoSomething ();
		[MethodImplAttribute(MethodImplOptions.InternalCall)]
		public extern override void DoSomething (bool useful);
	
	should be mapped with the following method names:
	
		"DoSomething()", ves_icall_Namespace_ClassName_DoSomething,
		"DoSomething(bool)", ves_icall_Namespace_ClassName_DoSomething_bool,
	

