+static int
+load_agent (MonoDomain *domain, char *desc)
+{
+ char* col = strchr (desc, ':');
+ char *agent, *args;
+ MonoAssembly *agent_assembly;
+ MonoImage *image;
+ MonoMethod *method;
+ guint32 entry;
+ MonoArray *main_args;
+ gpointer pa [1];
+ MonoImageOpenStatus open_status;
+
+ if (col) {
+ agent = g_memdup (desc, col - desc + 1);
+ agent [col - desc] = '\0';
+ args = col + 1;
+ } else {
+ agent = g_strdup (desc);
+ args = NULL;
+ }
+
+ agent_assembly = mono_assembly_open (agent, &open_status);
+ if (!agent_assembly) {
+ fprintf (stderr, "Cannot open agent assembly '%s': %s.\n", agent, mono_image_strerror (open_status));
+ g_free (agent);
+ return 2;
+ }
+
+ /*
+ * Can't use mono_jit_exec (), as it sets things which might confuse the
+ * real Main method.
+ */
+ image = mono_assembly_get_image (agent_assembly);
+ entry = mono_image_get_entry_point (image);
+ if (!entry) {
+ g_print ("Assembly '%s' doesn't have an entry point.\n", mono_image_get_filename (image));
+ g_free (agent);
+ return 1;
+ }
+
+ method = mono_get_method (image, entry, NULL);
+ if (method == NULL){
+ g_print ("The entry point method of assembly '%s' could not be loaded\n", agent);
+ g_free (agent);
+ return 1;
+ }
+
+ mono_thread_set_main (mono_thread_current ());
+
+ if (args) {
+ main_args = (MonoArray*)mono_array_new (domain, mono_defaults.string_class, 1);
+ mono_array_set (main_args, MonoString*, 0, mono_string_new (domain, args));
+ } else {
+ main_args = (MonoArray*)mono_array_new (domain, mono_defaults.string_class, 0);
+ }
+
+ g_free (agent);
+
+ pa [0] = main_args;
+ /* Pass NULL as 'exc' so unhandled exceptions abort the runtime */
+ mono_runtime_invoke (method, NULL, pa, NULL);
+
+ return 0;
+}
+