Add Mono.Debugger.Soft to MonkeyBuilder.
[mono/afaerber.git] / docs / sources / mono-api-metadata.html
blob299f4c7b59488459a5581c953d40de6ea97e0e5f
1 <h1>Metadata Reading</h1>
3 <p>The Metadata API gives developers low-level access to the
4 information encoded in CLI modules: type and
5 methods definitions encoded in metadata as well as access to
6 the CIL code and embedded resources.
8 <p>Managed developers access this information using either the
9 System.Reflection API or a library
10 like <a href="http://www.mono-project.com/Cecil">Cecil</a>.
12 <p>To start using the Metadata API it is necessary
13 to <a href="mono-api-assembly.html#cil_assembly_load">open an
14 assembly</a> or a CIL image (a .dll or .exe file) using one of
15 the
16 <a href="mono-api-image.html#cil_image_open">CIL image
17 opening</a> API calls.
19 <h2>Metadata Heaps</h2>
21 <p>ECMA CLI images contain four heaps that store different
22 kinds of information, these are:
24 <ul>
25 <li>GUID heap (called #GUID) contains 128-bit GUIDs,
26 you can get pointer to a GUID value by
27 calling <a href="#api:mono_metadata_guid_heap">mono_metadata_guid_heap</a>.
29 <li>User string heap (called #US), it contains user
30 visible strings, you can fetch a string from this heap
31 by calling
32 <a href="#api:mono_metadata_user_string">mono_metadata_user_string</a>.
34 <li>Blob heap (called #blob), it contains binary
35 blobs of data, you can get a blob
36 by <a href="#api:mono_metadata_blob_heap">mono_metadata_blob_heap</a>.
37 You can determine the size of the blob using
38 the <a href="#api:mono_metadata_decode_blob_size">mono_metadata_decode_blob_size</a>.
40 </ul>
42 <p>The ECMA file format also has an extra section called the
43 "#~" stream, this stream is the one that holds the metadata
44 tables. There is a high-level API to get access to the
45 contents of this API, described in the
46 section <a href="#metadata-tables">Metadata Tables</a>.
48 <h4><a name="api:mono_metadata_guid_heap">mono_metadata_guid_heap</a></h4>
49 <h4><a name="api:mono_metadata_string_heap">mono_metadata_string_heap</a></h4>
50 <h4><a name="api:mono_metadata_blob_heap">mono_metadata_blob_heap</a></h4>
51 <h4><a name="api:mono_metadata_user_string">mono_metadata_user_string</a></h4>
52 <h4><a name="api:mono_metadata_decode_blob_size">mono_metadata_decode_blob_size</a></h4>
54 <a name="metadata-tables"/>
55 <h2>Metadata Tables</h2>
57 <p>Metadata is encoded in a number of tables included on every
58 CIL image. These tables contain type definitions, member
59 definitions and so on, these constants are defined in the ECMA 335
60 specification Partition II section 22. The following table
61 shows the C constants defined in the Mono runtime and how they
62 map to the equivalent ECMA CLI metadata table:
64 <center>
65 <table border=1>
66 <thead>
67 <td>
68 <b>ECMA CLI Table Name</b>
69 </td>
70 <td>
71 <b>C Constant Name</b>
72 </td>
73 <td>
74 <b>Table Schema (Array Size + Columns Constants)</b>
75 </td>
76 </thead>
77 <td>Assembly</td><td>MONO_TABLE_ASSEMBLY</td><td>
78 Array size:
79 MONO_ASSEMBLY_SIZE
80 <ul>
81 <li>MONO_ASSEMBLY_HASH_ALG
82 <li>MONO_ASSEMBLY_MAJOR_VERSION
83 <li>MONO_ASSEMBLY_MINOR_VERSION
84 <li>MONO_ASSEMBLY_BUILD_NUMBER
85 <li>MONO_ASSEMBLY_REV_NUMBER
86 <li>MONO_ASSEMBLY_FLAGS
87 <li>MONO_ASSEMBLY_PUBLIC_KEY
88 <li>MONO_ASSEMBLY_NAME
89 <li>MONO_ASSEMBLY_CULTURE
90 </ul>
91 </td>
92 </tr>
94 <td>AssemblyOS</td><td>MONO_TABLE_ASSEMBLYOS</td><td>
95 Array size:
96 MONO_ASSEMBLYOS_SIZE
97 <ul>
98 <li>MONO_ASSEMBLYOS_PLATFORM
99 <li>MONO_ASSEMBLYOS_MAJOR_VERSION
100 <li>MONO_ASSEMBLYOS_MINOR_VERSION
101 </ul>
102 </td>
103 </tr>
105 <td>AssemblyProcessor</td><td>MONO_TABLE_ASSEMBLYPROCESSOR</td><td>Array
106 size: MONO_ASSEMBLYPROCESSOR_SIZE
107 <ul>
108 <li>MONO_ASSEMBLY_PROCESSOR
109 </ul>
110 </td>
111 </tr>
113 <td>AssemblyRef</td><td>MONO_TABLE_ASSEMBLYREF</td><td>
114 Array size:
115 MONO_ASSEMBLYREF_SIZE
116 <ul>
117 <li>MONO_ASSEMBLYREF_MAJOR_VERSION
118 <li>MONO_ASSEMBLYREF_MINOR_VERSION
119 <li>MONO_ASSEMBLYREF_BUILD_NUMBER
120 <li>MONO_ASSEMBLYREF_REV_NUMBER
121 <li>MONO_ASSEMBLYREF_FLAGS
122 <li>MONO_ASSEMBLYREF_PUBLIC_KEY
123 <li>MONO_ASSEMBLYREF_NAME
124 <li>MONO_ASSEMBLYREF_CULTURE
125 <li>MONO_ASSEMBLYREF_HASH_VALUE
126 </ul>
127 </td>
128 </tr>
130 <td>AssemblyRefProcessor</td><td>MONO_TABLE_ASSEMBLYREFPROCESSOR</td><td>Array
131 size: MONO_ASSEMBLYREFPROC_SIZE
132 <ul>
133 <li>MONO_ASSEMBLYREFPROC_PROCESSOR
134 <li>MONO_ASSEMBLYREFPROC_ASSEMBLYREF
135 </ul>
136 </td>
137 </tr>
139 <td>AssemblyRefOS</td><td>MONO_TABLE_ASSEMBLYREFOS</td><td>
140 Array size:
141 <li>MONO_ASSEMBLYREFOS_SIZE
142 <ul>
143 <li>MONO_ASSEMBLYREFOS_PLATFORM
144 <li>MONO_ASSEMBLYREFOS_MAJOR_VERSION
145 <li>MONO_ASSEMBLYREFOS_MINOR_VERSION
146 <li>MONO_ASSEMBLYREFOS_ASSEMBLYREF
147 </ul>
148 </td>
149 </tr>
151 <td>ClassLayout</td><td>MONO_TABLE_CLASSLAYOUT</td><td>
152 Array size:
153 MONO_CLASSLAYOUT_SIZE
154 <ul>
155 <li>MONO_CLASS_LAYOUT_PACKING_SIZE
156 <li>MONO_CLASS_LAYOUT_CLASS_SIZE
157 <li>MONO_CLASS_LAYOUT_PARENT
158 </ul>
159 </td>
160 </tr>
162 <td>Constant</td><td>MONO_TABLE_CONSTANT</td><td>
163 Array size:
164 MONO_CONSTANT_SIZE
165 <ul>
166 <li>MONO_CONSTANT_TYPE
167 <li>MONO_CONSTANT_PADDING
168 <li>MONO_CONSTANT_PARENT
169 <li>MONO_CONSTANT_VALUE
170 </ul>
171 </td>
172 </tr>
174 <td>CustomAttribute</td><td>MONO_TABLE_CUSTOMATTRIBUTE</td><td>
175 Array size:
176 MONO_CUSTOM_ATTR_SIZE
177 <ul>
178 <li>MONO_CUSTOM_ATTR_PARENT
179 <li>MONO_CUSTOM_ATTR_TYPE
180 <li>MONO_CUSTOM_ATTR_VALUE
181 </ul>
182 </td>
183 </tr>
185 <td>DeclSecurity</td><td>MONO_TABLE_DECLSECURITY</td><td>
186 Array size:
187 MONO_DECL_SECURITY_SIZE
188 <ul>
189 <li>MONO_DECL_SECURITY_ACTION
190 <li>MONO_DECL_SECURITY_PARENT
191 <li>MONO_DECL_SECURITY_PERMISSIONSET
192 </ul>
193 </td>
194 </tr>
196 <td>EventMap</td><td>MONO_TABLE_EVENTMAP</td><td>
197 Array size:
198 MONO_EVENT_MAP_SIZE
199 <ul>
200 <li>MONO_EVENT_MAP_PARENT
201 <li>MONO_EVENT_MAP_EVENTLIST
202 </ul>
203 </td>
204 </tr>
206 <td>EventPtr</td><td>MONO_TABLE_EVENT_POINTER</td><td>
207 Array size:
208 MONO_EVENT_POINTER_SIZE
209 <ul>
210 <li>MONO_EVENT_POINTER_EVENT
211 </ul>
212 </td>
213 </tr>
215 <td>Event</td><td>MONO_TABLE_EVENT</td><td>
216 Array size: MONO_EVENT_SIZE
217 <ul>
218 <li>MONO_EVENT_FLAGS
219 <li>MONO_EVENT_NAME
220 <li>MONO_EVENT_TYPE
221 </ul>
222 </td>
223 </tr>
225 <td>ExportedType</td><td>MONO_TABLE_EXPORTEDTYPE</td><td>
226 Array size:
227 MONO_EXPORTEDTYPE_SIZE
228 <ul>
229 <li>MONO_EXP_TYPE_FLAGS
230 <li>MONO_EXP_TYPE_TYPEDEF
231 <li>MONO_EXP_TYPE_NAME
232 <li>MONO_EXP_TYPE_NAMESPACE
233 <li>MONO_EXP_TYPE_IMPLEMENTATION
234 </ul>
235 </td>
236 </tr>
238 <td>Field</td><td>MONO_TABLE_FIELD</td><td>
239 Array size: MONO_FIELD_SIZE
240 <ul>
241 <li>MONO_FIELD_FLAGS
242 <li>MONO_FIELD_NAME
243 <li>MONO_FIELD_SIGNATURE
244 </ul>
245 </td>
246 </tr>
248 <td>FieldLayoutt</td><td>MONO_TABLE_FIELDLAYOUT</td><td>
249 Array size:
250 MONO_FIELDLAYOUT_SIZE
251 <ul>
252 <li>MONO_FIELD_LAYOUT_OFFSET
253 <li>MONO_FIELD_LAYOUT_FIELD
254 </ul>
255 </td>
256 </tr>
258 <td>FieldMarshal</td><td>MONO_TABLE_FIELDMARSHAL</td><td>
259 Array size:
260 MONO_FIELD_MARSHAL_SIZE
261 <ul>
262 <li>MONO_FIELD_MARSHAL_PARENT
263 <li>MONO_FIELD_MARSHAL_NATIVE_TYPE
264 </ul>
265 </td>
266 </tr>
268 <td>FieldPtr</td><td>MONO_TABLE_FIELD_POINTER</td><td>
269 Array size:
270 MONO_FIELD_POINTER_SIZE
271 <ul>
272 <li>MONO_FIELD_POINTER_FIELD
273 </ul>
274 </td>
275 </tr>
277 <td>FieldRVA</td><td>MONO_TABLE_FIELDRVA</td><td>
278 Array size:
279 MONO_FIELDRVA_SIZE
280 <ul>
281 <li>MONO_FIELD_RVA_RVA
282 <li>MONO_FIELD_RVA_FIELD
283 </ul>
284 </td>
285 </tr>
287 <td>File</td><td>MONO_TABLE_FILE</td><td>
288 Array size: MONO_FILE_SIZE
289 <ul>
290 <li>MONO_FILE_FLAGS
291 <li>MONO_FILE_NAME
292 <li>MONO_FILE_HASH_VALUE
293 </ul>
294 </td>
295 </tr>
297 <td>GenericParam</td><td>MONO_TABLE_GENERICPARAM</td><td>
298 Array size:
299 MONO_GENERICPARAM_SIZE
300 <ul>
301 <li>MONO_GENERICPARAM_NUMBER
302 <li>MONO_GENERICPARAM_FLAGS
303 <li>MONO_GENERICPARAM_OWNER
304 <li>MONO_GENERICPARAM_NAME
305 </ul>
306 </td>
307 </tr>
309 <td>GenericParamConstraint</td><td>MONO_TABLE_GENERICPARAMCONSTRAINT</td><td>Array
310 size: MONO_GENERICPARAMCONSTRAINT_SIZE
311 <ul>
312 <li>MONO_GENPARCONSTRAINT_GENERICPAR
313 <li>MONO_GENPARCONSTRAINT_CONSTRAINT
314 </ul>
315 </td>
317 <tr>
318 <td>ImplMap</td><td>MONO_TABLE_IMPLMAP</td><td>
319 Array size:
320 MONO_IMPLMAP_SIZE
321 <ul>
322 <li>MONO_IMPLMAP_FLAGS
323 <li>MONO_IMPLMAP_MEMBER
324 <li>MONO_IMPLMAP_NAME
325 <li>MONO_IMPLMAP_SCOPE
326 </ul>
327 </td>
328 </tr>
331 <td>InterfaceImpl</td><td>MONO_TABLE_INTERFACEIMPL</td><td>
332 Array size:
333 <li>MONO_INTERFACEIMPL_SIZE
334 <ul>
335 <li>MONO_INTERFACEIMPL_CLASS
336 <li>MONO_INTERFACEIMPL_INTERFACE
337 </ul>
338 </td>
339 </tr>
342 <td>ManifestResource</td><td>MONO_TABLE_MANIFESTRESOURCE</td><td>Array
343 size: MONO_MANIFESTRESOURCE_SIZE
344 <ul>
345 <li>MONO_MANIFEST_OFFSET
346 <li>MONO_MANIFEST_FLAGS
347 <li>MONO_MANIFEST_NAME
348 <li>MONO_MANIFEST_IMPLEMENTATION
349 </ul>
350 </td>
351 </tr>
353 <tr>
354 <td>MemberRef</td><td>MONO_TABLE_MEMBERREF</td><td>
355 Array size:
356 MONO_MEMBERREF_SIZE
357 <ul>
358 <li>MONO_MEMBERREF_CLASS
359 <li>MONO_MEMBERREF_NAME
360 <li>MONO_MEMBERREF_SIGNATURE
361 </ul>
362 </td>
363 </tr>
365 <td>MethodImpl</td><td>MONO_TABLE_METHODIMPL</td><td>
366 Array size:
367 MONO_METHODIMPL_SIZE
368 <ul>
369 <li>MONO_METHODIMPL_CLASS
370 <li>MONO_METHODIMPL_BODY
371 <li>MONO_METHODIMPL_DECLARATION
372 </ul>
373 </td>
374 </tr>
377 <td>MethodSpec</td><td>MONO_TABLE_METHODSPEC</td><td>
378 Array size:
379 MONO_METHODSPEC_SIZE
380 <ul>
381 <li>MONO_METHODSPEC_METHOD
382 <li>MONO_METHODSPEC_SIGNATURE
383 </ul>
384 </td>
385 </tr>
386 <tr>
387 <td>MethodSemantics</td><td>MONO_TABLE_METHODSEMANTICS</td><td>Array
388 size: MONO_METHOD_SEMA_SIZE
389 <ul>
390 <li>MONO_METHOD_SEMA_SEMANTICS
391 <li>MONO_METHOD_SEMA_METHOD
392 <li>MONO_METHOD_SEMA_ASSOCIATION
393 </ul>
394 </td>
395 </tr>
397 <td>Moduleref</td><td>MONO_TABLE_MODULEREF</td><td>
398 Array size:
399 MONO_MODULEREF_SIZE
400 <ul>
401 <li>MONO_MODULEREF_NAME
402 </ul>
403 </td>
404 </tr>
406 <tr>
407 <td>Module</td><td>MONO_TABLE_MODULE</td><td>
408 Array size:
409 MONO_MODULE_SIZE
410 <br>
411 Columns:
412 <ul>
413 <li>MONO_MODULE_GENERATION
414 <li>MONO_MODULE_NAME
415 <li>MONO_MODULE_MVID
416 <li>MONO_MODULE_ENC
417 <li>MONO_MODULE_ENCBASE
418 </ul>
419 </td>
420 </tr>
422 <td>TypeRef</td><td>MONO_TABLE_TYPEREF</td><td>
423 Array size:
424 MONO_TYPEREF_SIZE
425 <ul>
426 <li>MONO_TYPEREF_SCOPE
427 <li>MONO_TYPEREF_NAME
428 <li>MONO_TYPEREF_NAMESPACE
429 </ul>
430 </td>
431 </tr>
433 <tr>
434 <td>MethodPtr</td><td>MONO_TABLE_METHOD_POINTER</td><td>
435 Array size:
436 MONO_METHOD_POINTER_SIZE
437 <ul>
438 <li>MONO_METHOD_POINTER_METHOD
439 </ul>
440 </td>
441 </tr>
443 <td>Method</td><td>MONO_TABLE_METHOD</td><td>
444 Array size:
445 MONO_METHOD_SIZE
446 <ul>
447 <li>MONO_METHOD_RVA
448 <li>MONO_METHOD_IMPLFLAGS
449 <li>MONO_METHOD_FLAGS
450 <li>MONO_METHOD_NAME
451 <li>MONO_METHOD_SIGNATURE
452 <li>MONO_METHOD_PARAMLIST
453 </ul>
454 </td>
455 </tr>
457 <tr>
458 <td>NestedClass</td><td>MONO_TABLE_NESTEDCLASS</td><td>
459 Array size:
460 MONO_NESTEDCLASS_SIZE
461 <ul>
462 <li>MONO_NESTED_CLASS_NESTED
463 <li>MONO_NESTED_CLASS_ENCLOSING
464 </ul>
465 </td>
466 </tr>
468 <tr>
469 <td>ParamPtr</td><td>MONO_TABLE_PARAM_POINTER</td><td>
470 Array size:
471 MONO_PARAM_POINTER_SIZE
472 <ul>
473 <li>MONO_PARAM_POINTER_PARAM
474 </ul>
475 </td>
476 </tr>
478 <td>Param</td><td>MONO_TABLE_PARAM</td><td>
479 Array size: MONO_PARAM_SIZE
480 <ul>
481 <li>MONO_PARAM_FLAGS
482 <li>MONO_PARAM_SEQUENCE
483 <li>MONO_PARAM_NAME
484 </ul>
485 </td>
486 </tr>
488 <td>PropertyMap</td><td>MONO_TABLE_PROPERTYMAP</td><td>
489 Array size:
490 MONO_PROPERTY_MAP_SIZE
491 <ul>
492 <li>MONO_PROPERTY_MAP_PARENT
493 <li>MONO_PROPERTY_MAP_PROPERTY_LIST
494 </ul>
495 </td>
496 </tr>
498 <td>PropertyPtr</td><td>MONO_TABLE_PROPERTY_POINTER</td><td>Array
499 size: MONO_PROPERTY_POINTER_SIZE
500 <ul>
501 <li>MONO_PROPERTY_POINTER_PROPERTY
502 </ul>
503 </td>
504 </tr>
506 <td>Property</td><td>MONO_TABLE_PROPERTY</td><td>
507 Array size:
508 MONO_PROPERTY_SIZE
509 <ul>
510 <li>MONO_PROPERTY_FLAGS
511 <li>MONO_PROPERTY_NAME
512 <li>MONO_PROPERTY_TYPE
513 </ul>
514 </td>
515 </tr>
516 <tr>
517 <td>StandaloneSig</td><td>MONO_TABLE_STANDALONESIG</td><td>
518 Array size:
519 <li>MONO_STAND_ALONE_SIGNATURE_SIZE
520 <ul>
521 <li>MONO_STAND_ALONE_SIGNATURE
522 </ul>
523 </td>
524 </tr>
526 <tr>
527 <td>TypeDef</td><td>MONO_TABLE_TYPEDEF</td><td>
528 Array size:
529 MONO_TYPEDEF_SIZE
530 <ul>
531 <li>MONO_TYPEDEF_FLAGS
532 <li>MONO_TYPEDEF_NAME
533 <li>MONO_TYPEDEF_NAMESPACE
534 <li>MONO_TYPEDEF_EXTENDS
535 <li>MONO_TYPEDEF_FIELD_LIST
536 <li>MONO_TYPEDEF_METHOD_LIST
537 </ul>
538 </td>
539 </tr>
541 <tr>
542 <td>TypeSpec</td><td>MONO_TABLE_TYPESPEC</td><td>
543 Array size:
544 MONO_TYPESPEC_SIZE
545 <ul>
546 <li>MONO_TYPESPEC_SIGNATURE
547 </ul>
548 </td>
549 </tr>
551 </table>
552 </center>
554 <p>Each table can contain zero or more rows, you must call the
555 <a href="#api:mono_metadata_table_rows">mono_metadata_table_rows</a>
556 to obtain the number of rows in a table, and then you can
557 extract individual row values by using
558 the <a href="#api:mono_metadata_decode_row">mono_metadata_decode_row</a>
560 the <a href="#api:mono_metadata_decode_row_col">mono_metadata_decode_row_col</a>.
561 When decoding rows you must provide an guint32 array large
562 enough to hold as many columns as the table contains.
564 <p>The metadata tables are stored in the MonoImage, you obtain
565 a pointer to the MonoTableInfo by calling
566 the <a href="#api:mono_image_get_table_info">mono_image_get_table_info</a>
567 and then you can scan those tables, for example:
569 <pre class="prettyprint">
571 * Dumps a few fields from the AssemblyRef table
573 void DumpAssemblyRefs (MonoImage *image)
575 /* Get a pointer to the AssemblyRef metadata table */
576 MonoTableInfo *t = mono_image_get_table_info (image, MONO_TABLE_ASSEMBLYREF);
578 /* Fetch the number of rows available in the table */
579 int rows = mono_table_info_get_rows (t);
580 int i;
582 /* For each row, print some of its values */
583 for (i = 0; i &lt; rows; i++){
584 /* Space where we extract one row from the metadata table */
585 guint32 cols [MONO_ASSEMBLYREF_SIZE];
587 /* Extract the row into the array cols */
588 mono_metadata_decode_row (t, i, cols, MONO_ASSEMBLYREF_SIZE);
590 fprintf (output, "%d: Version=%d.%d.%d.%d\n\tName=%s\n", i + 1,
591 cols [MONO_ASSEMBLYREF_MAJOR_VERSION],
592 cols [MONO_ASSEMBLYREF_MINOR_VERSION],
593 cols [MONO_ASSEMBLYREF_BUILD_NUMBER],
594 cols [MONO_ASSEMBLYREF_REV_NUMBER],
595 mono_metadata_string_heap (image, cols [MONO_ASSEMBLYREF_NAME]));
598 </pre>
600 <p>The above program shows the following output when ran on
601 the C# compiler:
603 <pre>
604 1: Version=1.0.5000.0
605 Name=mscorlib
606 2: Version=1.0.5000.0
607 Name=System
608 3: Version=1.0.5000.0
609 Name=System.Xml
610 </pre>
614 <h3>Metadata Tables API</h3>
616 <p>These are the APIs for dealing with tables:
618 <h4><a name="api:mono_image_get_table_info">mono_image_get_table_info</a></h4>
619 <h4><a name="api:mono_image_get_table_rows">mono_image_get_table_rows</a></h4>
620 <h4><a name="api:mono_metadata_get_table">mono_metadata_get_table</a></h4>
621 <h4><a name="api:mono_meta_table_name">mono_meta_table_name</a></h4>
622 <h4><a name="api:mono_metadata_decode_row_col">mono_metadata_decode_row_col</a></h4>
623 <h4><a name="api:mono_metadata_decode_row">mono_metadata_decode_row</a></h4>
624 <h4><a name="api:mono_metadata_compute_size">mono_metadata_compute_size</a></h4>
625 <h4><a name="api:mono_metadata_custom_attrs_from_index">mono_metadata_custom_attrs_from_index</a></h4>
626 <h4><a name="api:mono_metadata_decode_signed_value">mono_metadata_decode_signed_value</a></h4>
627 <h4><a name="api:mono_metadata_decode_value">mono_metadata_decode_value</a></h4>
628 <h4><a name="api:mono_metadata_encode_value">mono_metadata_encode_value</a></h4>
630 <h2>Metadata access API</h2>
632 <p>This is the low-level API for accessing the metadata
633 images.
635 <h4><a name="api:mono_cli_rva_image_map">mono_cli_rva_image_map</a></h4>
636 <h4><a name="api:mono_pe_file_open">mono_pe_file_open</a></h4>
637 <h4><a name="api:mono_metadata_events_from_typedef">mono_metadata_events_from_typedef</a></h4>
638 <h4><a name="api:mono_metadata_field_info">mono_metadata_field_info</a></h4>
639 <h4><a name="api:mono_metadata_free_array">mono_metadata_free_array</a></h4>
640 <h4><a name="api:mono_metadata_free_marshal_spec">mono_metadata_free_marshal_spec</a></h4>
641 <h4><a name="api:mono_metadata_free_mh">mono_metadata_free_mh</a></h4>
642 <h4><a name="api:mono_metadata_free_type">mono_metadata_free_type</a></h4>
643 <h4><a name="api:mono_metadata_get_constant_index">mono_metadata_get_constant_index</a></h4>
644 <h4><a name="api:mono_metadata_get_marshal_info">mono_metadata_get_marshal_info</a></h4>
645 <h4><a name="api:mono_metadata_implmap_from_method">mono_metadata_implmap_from_method</a></h4>
646 <h4><a name="api:mono_metadata_interfaces_from_typedef_full">mono_metadata_interfaces_from_typedef_full</a></h4>
647 <h4><a name="api:mono_metadata_interfaces_from_typedef">mono_metadata_interfaces_from_typedef</a></h4>
648 <h4><a name="api:mono_metadata_locate">mono_metadata_locate</a></h4>
649 <h4><a name="api:mono_metadata_locate_token">mono_metadata_locate_token</a></h4>
650 <h4><a name="api:mono_metadata_methods_from_event">mono_metadata_methods_from_event</a></h4>
651 <h4><a name="api:mono_metadata_methods_from_property">mono_metadata_methods_from_property</a></h4>
652 <h4><a name="api:mono_metadata_nested_in_typedef">mono_metadata_nested_in_typedef</a></h4>
653 <h4><a name="api:mono_metadata_nesting_typedef">mono_metadata_nesting_typedef</a></h4>
654 <h4><a name="api:mono_metadata_packing_from_typedef">mono_metadata_packing_from_typedef</a></h4>
655 <h4><a name="api:mono_metadata_properties_from_typedef">mono_metadata_properties_from_typedef</a></h4>
656 <h4><a name="api:mono_metadata_token_from_dor">mono_metadata_token_from_dor</a></h4>
657 <h4><a name="api:mono_metadata_typedef_from_field">mono_metadata_typedef_from_field</a></h4>
658 <h4><a name="api:mono_metadata_typedef_from_method">mono_metadata_typedef_from_method</a></h4>
659 <h4><a name="api:mono_metadata_type_equal">mono_metadata_type_equal</a></h4>
660 <h4><a name="api:mono_metadata_type_hash">mono_metadata_type_hash</a></h4>
661 <h4><a name="api:mono_metadata_declsec_from_index">mono_metadata_declsec_from_index</a></h4>
662 <h4><a name="api:mono_metadata_free_method_signature">mono_metadata_free_method_signature</a></h4>
664 <h3>Retrieving Objects from Tokens</h3>
666 <h4><a name="api:mono_metadata_parse_custom_mod">mono_metadata_parse_custom_mod</a></h4>
667 <h4><a name="api:mono_metadata_parse_field_type">mono_metadata_parse_field_type</a></h4>
668 <h4><a name="api:mono_metadata_parse_marshal_spec">mono_metadata_parse_marshal_spec</a></h4>
669 <h4><a name="api:mono_metadata_parse_method_signature_full">mono_metadata_parse_method_signature_full</a></h4>
670 <h4><a name="api:mono_metadata_parse_method_signature">mono_metadata_parse_method_signature</a></h4>
671 <h4><a name="api:mono_metadata_parse_mh_full">mono_metadata_parse_mh_full</a></h4>
672 <h4><a name="api:mono_metadata_parse_mh">mono_metadata_parse_mh</a></h4>
673 <h4><a name="api:mono_metadata_parse_param">mono_metadata_parse_param</a></h4>
674 <h4><a name="api:mono_metadata_parse_signature_full">mono_metadata_parse_signature_full</a></h4>
675 <h4><a name="api:mono_metadata_parse_signature">mono_metadata_parse_signature</a></h4>
676 <h4><a name="api:mono_metadata_parse_typedef_or_ref">mono_metadata_parse_typedef_or_ref</a></h4>
677 <h4><a name="api:mono_metadata_parse_type_full">mono_metadata_parse_type_full</a></h4>
678 <h4><a name="api:mono_metadata_parse_type">mono_metadata_parse_type</a></h4>
680 <h2>Metadata Loader Locking</h2>
682 <p>The locking functions here are used by code in class.c and
683 metadata.c to lock access to the shared hashtables inside the
684 MonoImage.
686 <h4><a name="api:mono_loader_lock">mono_loader_lock</a></h4>
687 <h4><a name="api:mono_loader_unlock">mono_loader_unlock</a></h4>
689 <h2>Generics Support</h2>
691 <h4><a name="api:mono_metadata_generic_class_is_valuetype">mono_metadata_generic_class_is_valuetype</a></h4>
692 <h4><a name="api:mono_metadata_has_generic_params">mono_metadata_has_generic_params</a></h4>
693 <h4><a name="api:mono_metadata_inflate_generic_inst">mono_metadata_inflate_generic_inst</a></h4>
694 <h4><a name="api:mono_metadata_parse_generic_inst">mono_metadata_parse_generic_inst</a></h4>
695 <h4><a name="api:mono_metadata_generic_inst_equal">mono_metadata_generic_inst_equal</a></h4>
696 <h4><a name="api:mono_metadata_generic_inst_hash">mono_metadata_generic_inst_hash</a></h4>
697 <h4><a name="api:mono_metadata_load_generic_params">mono_metadata_load_generic_params</a></h4>
698 <h4><a name="api:mono_metadata_generic_inst_is_valuetype">mono_metadata_generic_inst_is_valuetype</a></h4>
699 <h4><a name="api:mono_metadata_generic_method_equal">mono_metadata_generic_method_equal</a></h4>
701 <h2>Tokens</h2>
703 <h4><a name="api:mono_ldtoken">mono_ldtoken</a></h4>
704 <h4><a name="api:mono_lookup_dynamic_token">mono_lookup_dynamic_token</a></h4>
705 <h4><a name="api:mono_ldstr">mono_ldstr</a></h4>
706 <h4><a name="api:mono_exception_from_token">mono_exception_from_token</a></h4>
707 <h4><a name="api:mono_create_jit_trampoline_from_token">mono_create_jit_trampoline_from_token</a></h4>
709 <h2>OpCodes</h2>
711 <h4><a name="api:mono_opcode_name">mono_opcode_name</a></h4>
712 <h4><a name="api:mono_opcode_value">mono_opcode_value</a></h4>
714 <h2>Metadata Loading Errors</h2>
716 <p>The routines in this section are used to cope with errors
717 during metadata loading. Errors in metadata handling can
718 happen for many reason, and these include (this is not an
719 exhaustive list).
721 <ul>
722 <li>An assembly referenced is missing.
723 <li>Fields referenced are missing.
724 <li>Methods referenced are missing.
725 </ul>
727 <p>The <tt>mono_loader_set_*</tt> routines are invoked during
728 metadata loading to flag that an error has happened. The
729 class loading errros are flagged in a per-thread basis.
731 <P>In various spots in the runtime the
732 <tt>mono_loader_get_last_error</tt> routine is called to check
733 if there was a problem, and then errors are propagated upwards
734 on the stack until we reach a point where an exception can be
735 raised and no runtime locks are held.
737 <p>The <tt>mono_loader_error_prepare_exception</tt> takes a
738 <tt>MonoLoaderError</tt> structure (the value returned from
739 <tt>mono_loader_get_last_error</tt>), turns that into an
740 exception and clears the error condition from the current
741 thread.
743 <h4><a name="api:mono_loader_set_error_field_load">mono_loader_set_error_field_load</a></h4>
744 <h4><a name="api:mono_loader_set_error_method_load">mono_loader_set_error_method_load</a></h4>
745 <h4><a name="api:mono_loader_set_error_type_load">mono_loader_set_error_type_load</a></h4>
747 <h4><a name="api:mono_loader_get_last_error">mono_loader_get_last_error</a></h4>
748 <h4><a name="api:mono_loader_clear_error">mono_loader_clear_error</a></h4>
749 <h4><a name="api:mono_loader_error_prepare_exception">mono_loader_error_prepare_exception</a></h4>