test-metadata.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include <mono/jit/jit.h>
  2. #include <glib.h>
  3. /*
  4. * Very simple mono embedding example.
  5. * This sample shows how to access metadata elements from an image.
  6. * Compile with:
  7. * gcc -o test-metadata test-metadata.c `pkg-config --cflags --libs mono-2` -lm
  8. * Run with:
  9. * ./test-metadata namespace name
  10. */
  11. void
  12. output_desc (MonoClass* klass) {
  13. printf ("Class name: %s.%s\n", mono_class_get_namespace (klass), mono_class_get_name (klass));
  14. printf ("Rank: %d, flags 0x%0x\n", mono_class_get_rank (klass), mono_class_get_flags (klass));
  15. }
  16. void
  17. output_ifaces (MonoClass* klass) {
  18. MonoClass *iface;
  19. gpointer iter = NULL;
  20. printf ("Implements: ");
  21. while ((iface = mono_class_get_interfaces (klass, &iter))) {
  22. printf ("%s ", mono_class_get_name (iface));
  23. }
  24. printf ("\n");
  25. }
  26. void
  27. output_nested (MonoClass* klass) {
  28. MonoClass *nested;
  29. gpointer iter = NULL;
  30. printf ("Has nested types: ");
  31. while ((nested = mono_class_get_nested_types (klass, &iter))) {
  32. printf ("%s ", mono_class_get_name (nested));
  33. }
  34. printf ("\n");
  35. }
  36. void
  37. output_fields (MonoClass* klass) {
  38. MonoClassField *field;
  39. gpointer iter = NULL;
  40. while ((field = mono_class_get_fields (klass, &iter))) {
  41. printf ("Field: %s, flags 0x%x\n", mono_field_get_name (field),
  42. mono_field_get_flags (field));
  43. }
  44. }
  45. void
  46. output_methods (MonoClass* klass) {
  47. MonoMethod *method;
  48. gpointer iter = NULL;
  49. while ((method = mono_class_get_methods (klass, &iter))) {
  50. guint32 flags, iflags;
  51. flags = mono_method_get_flags (method, &iflags);
  52. printf ("Method: %s, flags 0x%x, iflags 0x%x\n",
  53. mono_method_get_name (method), flags, iflags);
  54. }
  55. }
  56. void
  57. output_properties (MonoClass* klass) {
  58. MonoProperty *prop;
  59. gpointer iter = NULL;
  60. while ((prop = mono_class_get_properties (klass, &iter))) {
  61. printf ("Property: %s, flags 0x%x\n", mono_property_get_name (prop),
  62. mono_property_get_flags (prop));
  63. }
  64. }
  65. void
  66. output_events (MonoClass* klass) {
  67. MonoEvent *event;
  68. gpointer iter = NULL;
  69. while ((event = mono_class_get_events (klass, &iter))) {
  70. printf ("Event: %s, flags: 0x%x\n", mono_event_get_name (event),
  71. mono_event_get_flags (event));
  72. }
  73. }
  74. int
  75. main (int argc, char* argv[]) {
  76. MonoDomain *domain;
  77. MonoClass *klass;
  78. MonoImage *image;
  79. const char *ns, *name;
  80. if (argc < 3){
  81. fprintf (stderr, "Please provide namespace and name of a type in mscorlib.\n");
  82. return 1;
  83. }
  84. ns = argv [1];
  85. name = argv [2];
  86. /*
  87. * mono_jit_init() creates a domain: each assembly is
  88. * loaded and run in a MonoDomain.
  89. */
  90. domain = mono_jit_init (argv [0]);
  91. if (argc > 3) {
  92. MonoImageOpenStatus status;
  93. image = mono_image_open (argv [3], &status);
  94. if (!image) {
  95. fprintf (stderr, "Can't load assembly \"%s\".\n", argv [3]);
  96. return 1;
  97. }
  98. } else {
  99. /* we default to using mscorlib */
  100. image = mono_get_corlib ();
  101. }
  102. klass = mono_class_from_name (image, ns, name);
  103. if (!klass) {
  104. fprintf (stderr, "Class \"%s.%s\" not found.\n", ns, name);
  105. return 1;
  106. }
  107. output_desc (klass);
  108. output_ifaces (klass);
  109. output_nested (klass);
  110. output_fields (klass);
  111. output_methods (klass);
  112. output_properties (klass);
  113. output_events (klass);
  114. mono_jit_cleanup (domain);
  115. return 0;
  116. }