linux-packaging-mono/docs/deploy/mono-api-methods.html
Xamarin Public Jenkins (auto-signing) e79aa3c0ed Imported Upstream version 4.6.0.125
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
2016-08-03 10:59:49 +00:00

1276 lines
46 KiB
HTML

<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>mono-api-methods.html</title>
<style type="text/css">
.mapi-docs {
line-height: 1.5;
padding-left: 2em;
padding-right: 2em;
}
.mapi-docs p {
max-width: 60em;
}
.mapi-docs .mapi-body {
max-width: 60em;
}
.mapi-docs code {
border: 1px solid rgba(214,214,214,1);
background-color: rgba(249,249,249,1);
padding: 0.1em 0.5em;
}
.mapi-description code {
font-family: "Consolas", "Courier", monospace;
border: 1px solid rgba(214,214,214,1);
background-color: rgba(249,249,249,1);
padding: 0.1em 0.2em;
}
.mapi-header {
padding: 0 0 5pt 5pt;
margin: 10pt;
white-space: pre;
font-family: monospace;
border: 1px solid rgba(233,233,233,1);
background-color: rgba(249,249,249,1);
}
.mapi-code {
padding: 5pt 5pt;
margin: 10pt;
white-space: pre;
font-family: monospace;
border: 1px solid rgba(233,233,233,1);
background-color: rgba(249,249,249,1);
}
.mapi-code:first-line {
line-height: 0px;
}
.mapi-entry code {
border: none;
background-color: transparent;
}
.mapi-parameters {
border-collapse: collapse;
border-spacing: 0;
empty-cells: hide;
border: 0;
margin: 5px 0 26px;
}
.mapi-parameters td {
border: 1px solid rgba(214,214,214,1);
border-left-style: none;
padding: 5px 25px 5px 10px;
}
.mapi-parameters tr>td:last-child {
border-right: 0;
}
.mapi-parameters td:first-of-type {
text-align: right;
padding: 7px;
vertical-align: top;
word-break: normal;
width: 40px;
}
.mapi-parameters tr:last-child>td {
border-bottom: 0;
}
.mapi-parameters tr:first-child>td {
border-top: 0;
}
.mapi-parameters tr td:first-of-type {
text-align: right;
padding: 7px;
vertical-align: top;
word-break: normal;
width: 40px;
}
.mapi {
left: -25px;
margin: 0;
padding: 13px 25px 0;
position: relative;
width: 100%;
}
.mapi-description {
background: rgba(249,249,249,1);
border-bottom: 1px solid rgba(233,233,233,1);
left: -25px;
margin: 0;
padding: 13px 25px 0;
position: relative;
width: 100%;
}
.mapi-entry {
background: transparent;
}
.mapi-docs {
}
.mapi-prototype {
border-left: 5px solid rgba(205,233,244,1);
padding: .5em;
margin-top: 5pt;
margin-bottom: 5pt;
font-family: "Consolas", "Courier", monospace;
display: block;
overflow: auto;
background-color: #f9f9f9;
}
.mapi-declaration {
margin-top: 21px;
}
.mapi-section {
font-size: smaller;
font-weight: bold;
margin-top: 21px;
line-height: 1.5;
}
.mapi-strike {
text-decoration: line-through;
}
.mapi-deprecated {
color: red;
}
.mapi-ptr-container {
background: white;
border-bottom: 1px solid rgba(233,233,233,1);
left: -25px;
padding-left: 25px;
padding-right: 25px;
padding-bottom: 13px;
position: relative;
width: 100%;
}
.mapi-ptr {
background: rgba(249,249,249,1);
border-left: 1px solid rgba(233,233,233,1);
border-top: 1px solid rgba(233,233,233,1);
height: 12px;
left: 37px;
top: -7px;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
position: absolute;
width: 12px;
}
.mapi-height-container {
left: -25px;
padding: 0 25px;
position: relative;
width: 100%;
}
</style>
</head>
<body>
<div class="mapi-docs">
<h2>Methods</h2>
<p />Methods are represented by the <code>MonoMethod*</code>
instances. Various APIs surface these instances, but usually
you will use the <a href="#method-desc">method description</a>
API to get a handle to a Mono Method. You can <a href="method-invoking">invoke</a> those methods from C,
or you can probe <a href="method-working">probe various properties</a> of a method, and in particular
its <a href="method-signature">method signature</a> or get
some <a href="method-header">low-level information</a> about them.
<p />The following code snippet from the Mono runtime shows you
how to create a managed <code>System.Version</code> instance
with four integers by looking up the constructor in the
managed implementation of System.Version, creating an instance
of the object, and then invoking the constructor on it.
<div class="mapi-header">
MonoObject*
create_version (MonoDomain *domain, guint32 major, guint32 minor, guint32 build, guint32 revision)
{
MonoClass *System_Version;
MonoMethod *create_version;
MonoError error;
MonoObject *result;
gpointer args [4];
System_Version = mono_class_from_name (mono_defaults.corlib, &quot;System&quot;, &quot;Version&quot;);
// Create a method description that we use to search for the
// constructor method
MonoMethodDesc *desc = mono_method_desc_new (&quot;:.ctor(int,int,int,int)&quot;, FALSE);
create_version = mono_method_desc_search_in_class (desc, System_Version);
mono_method_desc_free (desc);
// Setup the parameters to pass.
args [0] = &amp;major;
args [1] = &amp;minor;
args [2] = &amp;build;
args [3] = &amp;revision;
// Create the object instance
result = mono_object_new_checked (domain, System_Version, &amp;error);
// Raise an exception in case of an error
mono_error_raise_exception (&amp;error);
// Otherwise, invoke the constructor
mono_runtime_invoke (create_version, result, args, NULL);
// Return ther esult
return result;
}
</div>
<a name="method-desc"></a>
<h3>Method Descriptions</h3>
<p />Methods are represented by the <code>MonoMethod*</code>
instances. To simplify the process of getting
a <code>MonoMethod*</code>, you use Method Descriptors, which
are C-strings that describe the method that you are looking
for, and then you perform a search in either
a <a href="mono-api-type.html">type</a>, or a
loaded <a href="mono-api-image.html">image</a>.
<p />To describe a method, you use the Method Description API.
Method descriptions are used to locate a method in the
executing program. They can either be fully specified, that
is, they would include the namespace, class, method name and
all of its arguments or they omit the namespace and arguments
and even use wildcard matches for the class name and method names.
<p />You use the fully specified version to identify a
particular method, or you can use the partial version to find
a method or a family of methods in the code.
<p />Method descriptions are typically created from a C string
representation, and take the following form:
<p /><code>[namespace.]classname:methodname[(args...)]</code>
<p />Both classname and methodname can contain the '*' character
which can be used to match anything. Arguments are separated
by commas.
<p />You can use the type shortcuts to match the fully qualified
parameter types. The supported type shortcuts are:
<code>char</code>,
<code>bool</code>,
<code>byte</code>,
<code>sbyte</code>,
<code>uint16</code>,
<code>int16</code>,
<code>uint</code>,
<code>int</code>,
<code>ulong</code>,
<code>long</code>,
<code>uintptr</code>,
<code>intptr</code>,
<code>single</code>,
<code>double</code>,
<code>string</code> and
<code>object</code>.
<p />The type parameters can use the &quot;&amp;&quot; and &quot;*&quot; type modifiers.
<p />Examples of method descriptions:
<ul>
<li>&quot;Monitor:Exit&quot;: matches classes and methods called &quot;Monitor.Exit&quot;
<li>&quot;Monitor:enter_with_atomic_var(object,bool&amp;)&quot;:
matches a method in the class Monitor with two
specific type parameters.
<li>&quot;:.ctor(int,int,int,int)&quot;: matches constructors
that take four integers.
<li>&quot;System.Globalization.CultureInfo:CreateCulture(string,bool)&quot;:
matches the CreateCultureMethod that takes a string
and a boolean on the System.Globalization.CultureInfo class.
</li></li></li></li></ul>
<p />You can
then <a href="api:mono_method_desc_search_in_image">search for
methods in MonoImages</a>
or <a href="api:mono_method_desc_search_in_class">search for
methods in classes</a>.
<a name="api:mono_method_desc_new"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_desc_new</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">MonoMethodDesc*
mono_method_desc_new (const char *name, gboolean include_namespace)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>name</i><td> the method name.</td></td></tr><tr><td><i>include_namespace</i><td> whether the name includes a namespace or not.</td></td></tr></tbody></table> <div class="mapi-section">Return value</div>
<div> a parsed representation of the method description.
</div>
<div class="mapi-section">Description</div>
<div> <p />
Creates a method description for <i>name</i>, which conforms to the following
specification:
<p />
[namespace.]classname:methodname[(args...)]
<p />
in all the loaded assemblies.
<p />
Both classname and methodname can contain '*' which matches anything.
<p /></div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_desc_free"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_desc_free</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">void
mono_method_desc_free (MonoMethodDesc *desc)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>desc</i><td> method description to be released</td></td></tr></tbody></table> <div class="mapi-section">Description</div>
<div> <p />
Releases the MonoMethodDesc object <i>desc</i>.</div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_desc_from_method"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_desc_from_method</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_desc_from_method</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_desc_full_match"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_desc_full_match</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_desc_full_match</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_desc_match"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_desc_match</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_desc_match</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_desc_search_in_class"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_desc_search_in_class</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_desc_search_in_class</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_desc_search_in_image"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_desc_search_in_image</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_desc_search_in_image</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
<a name="method-working"></a>
<h3>Working with Methods</h3>
</div> <!-- class=mapi -->
<a name="api:mono_method_full_name"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_full_name</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_full_name</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_get_class"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_class</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_get_class</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_get_flags"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_flags</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_get_flags</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_get_last_managed"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_last_managed</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_get_last_managed</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_get_marshal_info"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_marshal_info</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_get_marshal_info</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_get_name"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_name</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_get_name</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_get_object"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_object</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_get_object</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_get_param_names"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_param_names</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_get_param_names</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_get_param_token"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_param_token</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_get_param_token</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_get_signature"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_signature</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_get_signature</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_get_index"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_index</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_get_index</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_get_signature_full"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_signature_full</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_get_signature_full</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_get_token"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_token</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_get_token</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_get_unmanaged_thunk"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_unmanaged_thunk</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">gpointer
mono_method_get_unmanaged_thunk (MonoMethod *method)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>method</i><td> method to generate a thunk for.</td></td></tr></tbody></table> <div class="mapi-section">Description</div>
<div> <p />
Returns an unmanaged-&gt;managed thunk that can be used to call
a managed method directly from C.
<p />
The thunk's C signature closely matches the managed signature:
<p />
C#: public bool Equals (object obj);
C: typedef MonoBoolean (*Equals)(MonoObject*,
MonoObject*, MonoException**);
<p />
The 1st (&quot;this&quot;) parameter must not be used with static methods:
<p />
C#: public static bool ReferenceEquals (object a, object b);
C: typedef MonoBoolean (*ReferenceEquals)(MonoObject*, MonoObject*,
MonoException**);
<p />
The last argument must be a non-null pointer of a MonoException* pointer.
It has &quot;out&quot; semantics. After invoking the thunk, *ex will be <code>NULL</code> if no
exception has been thrown in managed code. Otherwise it will point
to the MonoException* caught by the thunk. In this case, the result of
the thunk is undefined:
<p />
MonoMethod *method = ... // MonoMethod* of System.Object.Equals
MonoException *ex = <code>NULL</code>;
Equals func = mono_method_get_unmanaged_thunk (method);
MonoBoolean res = func (thisObj, objToCompare, &amp;ex);
if (ex) {
// handle exception
}
<p />
The calling convention of the thunk matches the platform's default
convention. This means that under Windows, C declarations must
contain the __stdcall attribute:
<p />
C: typedef MonoBoolean (__stdcall *Equals)(MonoObject*,
MonoObject*, MonoException**);
<p />
LIMITATIONS
<p />
Value type arguments and return values are treated as they were objects:
<p />
C#: public static Rectangle Intersect (Rectangle a, Rectangle b);
C: typedef MonoObject* (*Intersect)(MonoObject*, MonoObject*, MonoException**);
<p />
Arguments must be properly boxed upon trunk's invocation, while return
values must be unboxed.</div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_has_marshal_info"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_has_marshal_info</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_has_marshal_info</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_verify"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_verify</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_verify</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
<a name="method-invoking"></a>
<h3>Invoking Methods</h3>
</div> <!-- class=mapi -->
<a name="api:mono_runtime_invoke"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_runtime_invoke</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">MonoObject*
mono_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObject **exc)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>method</i><td> method to invoke</td></td></tr><tr><td><i>obJ</i><td> object instance</td></td></tr><tr><td><i>params</i><td> arguments to the method</td></td></tr><tr><td><i>exc</i><td> exception information.</td></td></tr></tbody></table> <div class="mapi-section">Description</div>
<div> <p />
Invokes the method represented by <i>method</i> on the object <i>obj</i>.
<p />
obj is the 'this' pointer, it should be <code>NULL</code> for static
methods, a MonoObject* for object instances and a pointer to
the value type for value types.
<p />
The params array contains the arguments to the method with the
same convention: MonoObject* pointers for object instances and
pointers to the value type otherwise.
<p />
From unmanaged code you'll usually use the
mono_runtime_invoke() variant.
<p />
Note that this function doesn't handle virtual methods for
you, it will exec the exact method you pass: we still need to
expose a function to lookup the derived class implementation
of a virtual method (there are examples of this in the code,
though).
<p />
You can pass <code>NULL</code> as the exc argument if you don't want to
catch exceptions, otherwise, *exc will be set to the exception
thrown, if any. if an exception is thrown, you can't use the
MonoObject* result from the function.
<p />
If the method returns a value type, it is boxed in an object
reference.</div>
</div><!--mapi-description -->
</div><!--height container -->
If you want to invoke generic methods, you must call the method on the
&quot;inflated&quot; class, which you can obtain from the
<tt>mono_object_get_class()</tt>
<div class="mapi-code">
MonoClass *clazz;
MonoMethod *method;
clazz = mono_object_get_class (obj);
/*
* If there are more Add methods declared, you
* may use mono_method_desc_search_in_class (clazz, &quot;:Add(T)&quot;),
* you must substitute &quot;:Add(T)&quot; with the correct type, for example
* for List&lt;int&gt;, you would use &quot;:Add(int)&quot;.
*/
method = mono_class_get_method_from_name (clazz, &quot;Add&quot;, 1);
mono_runtime_invoke (method, obj, args, &amp;exception);
</div>
</div> <!-- class=mapi -->
<a name="api:mono_runtime_invoke_array"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_runtime_invoke_array</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">MonoObject*
mono_runtime_invoke_array (MonoMethod *method, void *obj, MonoArray *params,
MonoObject **exc)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>method</i><td> method to invoke</td></td></tr><tr><td><i>obJ</i><td> object instance</td></td></tr><tr><td><i>params</i><td> arguments to the method</td></td></tr><tr><td><i>exc</i><td> exception information.</td></td></tr></tbody></table> <div class="mapi-section">Description</div>
<div> <p />
Invokes the method represented by <i>method</i> on the object <i>obj</i>.
<p />
obj is the 'this' pointer, it should be <code>NULL</code> for static
methods, a MonoObject* for object instances and a pointer to
the value type for value types.
<p />
The params array contains the arguments to the method with the
same convention: MonoObject* pointers for object instances and
pointers to the value type otherwise. The _invoke_array
variant takes a C# object[] as the params argument (MonoArray
*params): in this case the value types are boxed inside the
respective reference representation.
<p />
From unmanaged code you'll usually use the
mono_runtime_invoke_checked() variant.
<p />
Note that this function doesn't handle virtual methods for
you, it will exec the exact method you pass: we still need to
expose a function to lookup the derived class implementation
of a virtual method (there are examples of this in the code,
though).
<p />
You can pass <code>NULL</code> as the exc argument if you don't want to
catch exceptions, otherwise, *exc will be set to the exception
thrown, if any. if an exception is thrown, you can't use the
MonoObject* result from the function.
<p />
If the method returns a value type, it is boxed in an object
reference.</div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_runtime_delegate_invoke"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_runtime_delegate_invoke</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">MonoObject*
mono_runtime_delegate_invoke (MonoObject *delegate, void **params, MonoObject **exc)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>delegate</i><td> pointer to a delegate object.</td></td></tr><tr><td><i>params</i><td> parameters for the delegate.</td></td></tr><tr><td><i>exc</i><td> Pointer to the exception result.</td></td></tr></tbody></table> <div class="mapi-section">Description</div>
<div> <p />
Invokes the delegate method <i>delegate</i> with the parameters provided.
<p />
You can pass <code>NULL</code> as the exc argument if you don't want to
catch exceptions, otherwise, *exc will be set to the exception
thrown, if any. if an exception is thrown, you can't use the
MonoObject* result from the function.</div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_body_get_object"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_body_get_object</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_body_get_object</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
<a name="method-signature"></a>
<h3>Method Signatures</h3>
</div> <!-- class=mapi -->
<a name="api:mono_method_signature"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_signature</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">MonoMethodSignature*
mono_method_signature (MonoMethod *m)
</div>
<p />
<div class="mapi-section">Description</div>
<div> <p />
Return the signature of the method M. On failure, returns <code>NULL</code>.</div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_signature_explicit_this"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_signature_explicit_this</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">gboolean
mono_signature_explicit_this (MonoMethodSignature *sig)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>sig</i><td> the method signature inspected</td></td></tr></tbody></table> <div class="mapi-section">Return value</div>
<div> #<code>TRUE</code> if this the method signature <i>sig</i> has an explicit
instance argument. #<code>FALSE</code> otherwise.</div>
<div class="mapi-section">Description</div>
<div> <p /> </div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_signature_get_call_conv"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_signature_get_call_conv</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">guint32
mono_signature_get_call_conv (MonoMethodSignature *sig)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>sig</i><td> the method signature inspected</td></td></tr></tbody></table> <div class="mapi-section">Return value</div>
<div> the call convention of the method signature <i>sig</i>.
</div>
<div class="mapi-section">Description</div>
<div> <p /> </div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_signature_get_desc"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_signature_get_desc</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_signature_get_desc</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_signature_get_param_count"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_signature_get_param_count</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">guint32
mono_signature_get_param_count (MonoMethodSignature *sig)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>sig</i><td> the method signature inspected</td></td></tr></tbody></table> <div class="mapi-section">Return value</div>
<div> the number of parameters in the method signature <i>sig</i>.
</div>
<div class="mapi-section">Description</div>
<div> <p /> </div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_signature_get_params"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_signature_get_params</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">MonoType*
mono_signature_get_params (MonoMethodSignature *sig, gpointer *iter)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>sig</i><td> the method signature inspected</td></td></tr><tr><td><i>iter</i><td> pointer to an iterator</td></td></tr></tbody></table> <div class="mapi-section">Return value</div>
<div> the next parameter type of the method signature <i>sig</i>,
#<code>NULL</code> when finished.</div>
<div class="mapi-section">Description</div>
<div> <p />
Iterates over the parameters for the method signature <i>sig</i>.
A void* pointer must be initualized to #<code>NULL</code> to start the iteration
and it's address is passed to this function repeteadly until it returns
#<code>NULL</code>.
<p /></div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_signature_get_return_type"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_signature_get_return_type</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">MonoType*
mono_signature_get_return_type (MonoMethodSignature *sig)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>sig</i><td> the method signature inspected</td></td></tr></tbody></table> <div class="mapi-section">Return value</div>
<div> the return type of the method signature <i>sig</i>
</div>
<div class="mapi-section">Description</div>
<div> <p /> </div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_signature_hash"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_signature_hash</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_signature_hash</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_signature_is_instance"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_signature_is_instance</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">gboolean
mono_signature_is_instance (MonoMethodSignature *sig)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>sig</i><td> the method signature inspected</td></td></tr></tbody></table> <div class="mapi-section">Return value</div>
<div> #<code>TRUE</code> if this the method signature <i>sig</i> has an implicit
first instance argument. #<code>FALSE</code> otherwise.</div>
<div class="mapi-section">Description</div>
<div> <p /> </div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_signature_param_is_out"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_signature_param_is_out</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_bool
mono_signature_param_is_out (MonoMethodSignature *sig, int param_num)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>sig</i><td> the method signature inspected</td></td></tr><tr><td><i>param_num</i><td> the 0-based index of the inspected parameter</td></td></tr></tbody></table> <div class="mapi-section">Return value</div>
<div> #<code>TRUE</code> if the parameter is an out parameter, #<code>FALSE</code>
otherwise.</div>
<div class="mapi-section">Description</div>
<div> <p /> </div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_signature_vararg_start"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_signature_vararg_start</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">int
mono_signature_vararg_start (MonoMethodSignature *sig)
</div>
<p />
<div class="mapi-section">Parameters</div>
<table class="mapi-parameters"><tbody><tr><td><i>sig</i><td> the method signature inspected</td></td></tr></tbody></table> <div class="mapi-section">Return value</div>
<div> the number of the first vararg parameter in the
method signature <i>sig</i>. -1 if this is not a vararg signature.</div>
<div class="mapi-section">Description</div>
<div> <p /> </div>
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_param_get_objects"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_param_get_objects</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_param_get_objects</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_get_method_full"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_get_method_full</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_get_method_full</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_get_method"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_get_method</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_get_method</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
<a name="method-header"></a>
<h3>Methods Header Operations</h3>
</div> <!-- class=mapi -->
<a name="api:mono_method_get_header"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_get_header</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_get_header</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_header_get_clauses"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_header_get_clauses</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_header_get_clauses</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_header_get_code"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_header_get_code</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_header_get_code</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div> <!-- class=mapi -->
<a name="api:mono_method_header_get_locals"></a>
<div class="mapi">
<div class="mapi-entry "><code>mono_method_header_get_locals</code></div>
<div class="mapi-height-container">
<div class="mapi-ptr-container"></div>
<div class="mapi-description">
<div class="mapi-ptr"></div>
<div class="mapi-declaration mapi-section">Syntax</div>
<div class="mapi-prototype">mono_method_header_get_locals</div>
<p />
</div><!--mapi-description -->
</div><!--height container -->
</div>
</div></body>
</html>