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