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, | ||
|  | 	 | ||
|  | 
 |