diff options
Diffstat (limited to 'samples')
-rw-r--r-- | samples/embed/teste.c | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/samples/embed/teste.c b/samples/embed/teste.c index ee7b84227d7..eb7131508c6 100644 --- a/samples/embed/teste.c +++ b/samples/embed/teste.c @@ -1,4 +1,5 @@ #include <mono/jit/jit.h> +#include <mono/metadata/environment.h> /* * Very simple mono embedding example. @@ -14,13 +15,40 @@ 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_jit_exec (main_args->domain, assembly, main_args->argc, + main_args->argv); +} + + int main(int argc, char* argv[]) { MonoDomain *domain; - MonoAssembly *assembly; const char *file; int retval; - + MainThreadArgs main_args; + if (argc < 2){ fprintf (stderr, "Please provide an assembly to load"); return 1; @@ -36,14 +64,17 @@ main(int argc, char* argv[]) { * can call us back. */ mono_add_internal_call ("Mono::gimme", gimme); - assembly = mono_domain_assembly_open (domain, file); - if (!assembly) - return 2; - /* - * mono_jit_exec() will run the Main() method in the assembly - * and return the value. - */ - retval = mono_jit_exec (domain, assembly, argc - 1, argv + 1); + + 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_jit_cleanup (domain); return retval; } |