test-metadata.c 3.1 KB

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