2
0

testi.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <mono/interpreter/embed.h>
  2. #include <mono/metadata/environment.h>
  3. /*
  4. * Very simple mint embedding example.
  5. * Compile with:
  6. * gcc -o testi testi.c `pkg-config --cflags --libs mint` -lm
  7. * mcs test.cs
  8. * Run with:
  9. * ./testi test.exe
  10. */
  11. static MonoString*
  12. gimme () {
  13. return mono_string_new (mono_domain_get (), "All your monos are belong to us!");
  14. }
  15. typedef struct
  16. {
  17. MonoDomain *domain;
  18. const char *file;
  19. int argc;
  20. char **argv;
  21. } MainThreadArgs;
  22. static void main_thread_handler (gpointer user_data)
  23. {
  24. MainThreadArgs *main_args=(MainThreadArgs *)user_data;
  25. MonoAssembly *assembly;
  26. assembly = mono_domain_assembly_open (main_args->domain,
  27. main_args->file);
  28. if (!assembly)
  29. exit (2);
  30. /*
  31. * mono_jit_exec() will run the Main() method in the assembly.
  32. * The return value needs to be looked up from
  33. * System.Environment.ExitCode.
  34. */
  35. mono_interp_exec (main_args->domain, assembly, main_args->argc,
  36. main_args->argv);
  37. }
  38. int
  39. main(int argc, char* argv[]) {
  40. MonoDomain *domain;
  41. const char *file;
  42. int retval;
  43. MainThreadArgs main_args;
  44. if (argc < 2){
  45. fprintf (stderr, "Please provide an assembly to load\n");
  46. return 1;
  47. }
  48. file = argv [1];
  49. /*
  50. * mono_jit_init() creates a domain: each assembly is
  51. * loaded and run in a MonoDomain.
  52. */
  53. domain = mono_interp_init (file);
  54. /*
  55. * We add our special internal call, so that C# code
  56. * can call us back.
  57. */
  58. mono_add_internal_call ("MonoEmbed::gimme", gimme);
  59. main_args.domain=domain;
  60. main_args.file=file;
  61. main_args.argc=argc-1;
  62. main_args.argv=argv+1;
  63. mono_runtime_exec_managed_code (domain, main_thread_handler,
  64. &main_args);
  65. retval=mono_environment_exitcode_get ();
  66. mono_interp_cleanup (domain);
  67. return retval;
  68. }