Welcome to mirror list, hosted at ThFree Co, Russian Federation.

internal-calls « docs - github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 2f3d4abbda0c6fadc93709d50687b6b66173b191 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

* How to map C# types for use in the C implementation of internal calls

	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*

For ref and out paramaters you'll use the corresponding pointer type.
Arrays of any type must be described with a MonoArray* and the elements 
must be accessed with the mono_array_* macros.
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 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 ();

becaomes:

	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 static table in metadata/icall.c.
Add an entry in the table like:

	"System.String::GetHashCode", ves_icall_System_String_GetHashCode,

Note that you need to include the full namespace.name of the class.
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:

	"Namespace.ClassName::DoSomething()", ves_icall_Namespace_ClassName_DoSomething,
	"Namespace.ClassName::DoSomething(bool)", ves_icall_Namespace_ClassName_DoSomething_bool,