2003-12-22 Bernie Solomon <bernard@ugsolutions.com>
authorBernie Solomon <bernard@mono-cvs.ximian.com>
Tue, 23 Dec 2003 03:49:13 +0000 (03:49 -0000)
committerBernie Solomon <bernard@mono-cvs.ximian.com>
Tue, 23 Dec 2003 03:49:13 +0000 (03:49 -0000)
* samples/embed/testi.c: interpreter embedding example

svn path=/trunk/mono/; revision=21443

ChangeLog
samples/embed/testi.c [new file with mode: 0644]

index f85d83e49183b6677b6f323163c1845eb647dbb4..430ef92afda5551295fedb1f402fa01aad03c9ad 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,8 @@
 
        * configure.in: missed in my last change
 
+       * samples/embed/testi.c: interpreter embedding example
+
 Mon Dec 22 18:27:14 CET 2003 Paolo Molaro <lupus@ximian.com>
 
        * configure.in, acconfig.h: use mach semaphores on darwin.
diff --git a/samples/embed/testi.c b/samples/embed/testi.c
new file mode 100644 (file)
index 0000000..a1ea82b
--- /dev/null
@@ -0,0 +1,81 @@
+#include <mono/interpreter/embed.h>
+#include <mono/metadata/environment.h>
+
+/*
+ * Very simple mint embedding example.
+ * Compile with: 
+ *     gcc -o testi testi.c `pkg-config --cflags --libs mint` -lm
+ *     mcs test.cs
+ * Run with:
+ *     ./testi test.exe
+ */
+
+static MonoString*
+gimme () {
+       return mono_string_new (mono_domain_get (), "All your monos are belong to us!");
+}
+
+typedef struct
+{
+       MonoDomain *domain;
+       const char *file;
+       int argc;
+       char **argv;
+} MainThreadArgs;
+
+static void main_thread_handler (gpointer user_data)
+{
+       MainThreadArgs *main_args=(MainThreadArgs *)user_data;
+       MonoAssembly *assembly;
+
+       assembly = mono_domain_assembly_open (main_args->domain,
+                                             main_args->file);
+       if (!assembly)
+               exit (2);
+       /*
+        * mono_jit_exec() will run the Main() method in the assembly.
+        * The return value needs to be looked up from
+        * System.Environment.ExitCode.
+        */
+       mono_interp_exec (main_args->domain, assembly, main_args->argc,
+                      main_args->argv);
+}
+
+
+int 
+main(int argc, char* argv[]) {
+       MonoDomain *domain;
+       const char *file;
+       int retval;
+       MainThreadArgs main_args;
+       
+       if (argc < 2){
+               fprintf (stderr, "Please provide an assembly to load\n");
+               return 1;
+       }
+       file = argv [1];
+       /*
+        * mono_jit_init() creates a domain: each assembly is
+        * loaded and run in a MonoDomain.
+        */
+       domain = mono_interp_init (file);
+       /*
+        * We add our special internal call, so that C# code
+        * can call us back.
+        */
+       mono_add_internal_call ("MonoEmbed::gimme", gimme);
+
+       main_args.domain=domain;
+       main_args.file=file;
+       main_args.argc=argc-1;
+       main_args.argv=argv+1;
+       
+       mono_runtime_exec_managed_code (domain, main_thread_handler,
+                                       &main_args);
+
+       retval=mono_environment_exitcode_get ();
+       
+       mono_interp_cleanup (domain);
+       return retval;
+}
+