mono-api-metadata.html 21 KB

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