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