linux-packaging-mono/docs/internal-calls
Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

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,