You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 			 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,
 | |
| 	
 | |
| 
 |