[runtime] Use MonoError for mono_try_assembly_resolve
[mono.git] / mono / metadata / appdomain.c
index d5cea26a9a751cb2cb6668e2b71a093d4f00402c..8e169963a094dc960b8e559ef84c1a2999addf0c 100644 (file)
@@ -55,6 +55,7 @@
 #include <mono/metadata/threads-types.h>
 #include <mono/metadata/tokentype.h>
 #include <mono/metadata/profiler-private.h>
+#include <mono/metadata/reflection-internals.h>
 #include <mono/utils/mono-uri.h>
 #include <mono/utils/mono-logger-internals.h>
 #include <mono/utils/mono-path.h>
@@ -79,7 +80,7 @@
  * Changes which are already detected at runtime, like the addition
  * of icalls, do not require an increment.
  */
-#define MONO_CORLIB_VERSION 140
+#define MONO_CORLIB_VERSION 142
 
 typedef struct
 {
@@ -110,7 +111,7 @@ static void
 add_assemblies_to_domain (MonoDomain *domain, MonoAssembly *ass, GHashTable *hash);
 
 static MonoAppDomain *
-mono_domain_create_appdomain_internal (char *friendly_name, MonoAppDomainSetup *setup);
+mono_domain_create_appdomain_internal (char *friendly_name, MonoAppDomainSetup *setup, MonoError *error);
 
 static char *
 get_shadow_assembly_location_base (MonoDomain *domain, MonoError *error);
@@ -158,6 +159,7 @@ mono_runtime_get_no_exec (void)
 static void
 create_domain_objects (MonoDomain *domain)
 {
+       MonoError error;
        MonoDomain *old_domain = mono_domain_get ();
        MonoString *arg;
        MonoVTable *string_vt;
@@ -193,7 +195,8 @@ create_domain_objects (MonoDomain *domain)
        domain->stack_overflow_ex = mono_exception_from_name_two_strings (mono_defaults.corlib, "System", "StackOverflowException", arg, NULL);
 
        /*The ephemeron tombstone i*/
-       domain->ephemeron_tombstone = mono_object_new (domain, mono_defaults.object_class);
+       domain->ephemeron_tombstone = mono_object_new_checked (domain, mono_defaults.object_class, &error);
+       mono_error_assert_ok (&error);
 
        if (domain != old_domain) {
                mono_thread_pop_appdomain_ref ();
@@ -223,6 +226,7 @@ void
 mono_runtime_init (MonoDomain *domain, MonoThreadStartCB start_cb,
                   MonoThreadAttachCB attach_cb)
 {
+       MonoError error;
        MonoAppDomainSetup *setup;
        MonoAppDomain *ad;
        MonoClass *klass;
@@ -245,10 +249,12 @@ mono_runtime_init (MonoDomain *domain, MonoThreadStartCB start_cb,
        mono_thread_init (start_cb, attach_cb);
 
        klass = mono_class_from_name (mono_defaults.corlib, "System", "AppDomainSetup");
-       setup = (MonoAppDomainSetup *) mono_object_new_pinned (domain, klass);
+       setup = (MonoAppDomainSetup *) mono_object_new_pinned (domain, klass, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
 
        klass = mono_class_from_name (mono_defaults.corlib, "System", "AppDomain");
-       ad = (MonoAppDomain *) mono_object_new_pinned (domain, klass);
+       ad = (MonoAppDomain *) mono_object_new_pinned (domain, klass, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
        ad->data = domain;
        domain->domain = ad;
        domain->setup = setup;
@@ -278,7 +284,7 @@ mono_runtime_init (MonoDomain *domain, MonoThreadStartCB start_cb,
 
        /* mscorlib is loaded before we install the load hook */
        mono_domain_fire_assembly_load (mono_defaults.corlib->assembly, NULL);
-       
+
        return;
 }
 
@@ -327,11 +333,13 @@ mono_check_corlib_version (void)
 void
 mono_context_init (MonoDomain *domain)
 {
+       MonoError error;
        MonoClass *klass;
        MonoAppContext *context;
 
        klass = mono_class_from_name (mono_defaults.corlib, "System.Runtime.Remoting.Contexts", "Context");
-       context = (MonoAppContext *) mono_object_new_pinned (domain, klass);
+       context = (MonoAppContext *) mono_object_new_pinned (domain, klass, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
        context->domain_id = domain->domain_id;
        context->context_id = 0;
        ves_icall_System_Runtime_Remoting_Contexts_Context_RegisterContext (context);
@@ -392,15 +400,18 @@ mono_runtime_quit ()
 MonoDomain *
 mono_domain_create_appdomain (char *friendly_name, char *configuration_file)
 {
+       MonoError error;
        MonoAppDomain *ad;
        MonoAppDomainSetup *setup;
        MonoClass *klass;
 
        klass = mono_class_from_name (mono_defaults.corlib, "System", "AppDomainSetup");
-       setup = (MonoAppDomainSetup *) mono_object_new (mono_domain_get (), klass);
+       setup = (MonoAppDomainSetup *) mono_object_new_checked (mono_domain_get (), klass, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
        setup->configuration_file = configuration_file != NULL ? mono_string_new (mono_domain_get (), configuration_file) : NULL;
 
-       ad = mono_domain_create_appdomain_internal (friendly_name, setup);
+       ad = mono_domain_create_appdomain_internal (friendly_name, setup, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
 
        return mono_domain_from_appdomain (ad);
 }
@@ -425,11 +436,19 @@ mono_domain_set_config (MonoDomain *domain, const char *base_dir, const char *co
 }
 
 static MonoAppDomainSetup*
-copy_app_domain_setup (MonoDomain *domain, MonoAppDomainSetup *setup)
+copy_app_domain_setup (MonoDomain *domain, MonoAppDomainSetup *setup, MonoError *error)
 {
-       MonoDomain *caller_domain = mono_domain_get ();
-       MonoClass *ads_class = mono_class_from_name (mono_defaults.corlib, "System", "AppDomainSetup");
-       MonoAppDomainSetup *copy = (MonoAppDomainSetup*)mono_object_new (domain, ads_class);
+       MonoDomain *caller_domain;
+       MonoClass *ads_class;
+       MonoAppDomainSetup *copy;
+
+       mono_error_init (error);
+
+       caller_domain = mono_domain_get ();
+       ads_class = mono_class_from_name (mono_defaults.corlib, "System", "AppDomainSetup");
+
+       copy = (MonoAppDomainSetup*)mono_object_new_checked (domain, ads_class, error);
+       return_val_if_nok (error, NULL);
 
        mono_domain_set_internal (domain);
 
@@ -460,20 +479,22 @@ copy_app_domain_setup (MonoDomain *domain, MonoAppDomainSetup *setup)
 }
 
 static MonoAppDomain *
-mono_domain_create_appdomain_internal (char *friendly_name, MonoAppDomainSetup *setup)
+mono_domain_create_appdomain_internal (char *friendly_name, MonoAppDomainSetup *setup, MonoError *error)
 {
-       MonoError error;
        MonoClass *adclass;
        MonoAppDomain *ad;
        MonoDomain *data;
        char *shadow_location;
-       
+
+       mono_error_init (error);
+
        adclass = mono_class_from_name (mono_defaults.corlib, "System", "AppDomain");
 
        /* FIXME: pin all those objects */
        data = mono_domain_create();
 
-       ad = (MonoAppDomain *) mono_object_new (data, adclass);
+       ad = (MonoAppDomain *) mono_object_new_checked (data, adclass, error);
+       return_val_if_nok (error, NULL);
        ad->data = data;
        data->domain = ad;
        data->friendly_name = g_strdup (friendly_name);
@@ -483,21 +504,32 @@ mono_domain_create_appdomain_internal (char *friendly_name, MonoAppDomainSetup *
        if (!setup->application_base) {
                /* Inherit from the root domain since MS.NET does this */
                MonoDomain *root = mono_get_root_domain ();
-               if (root->setup->application_base)
-                       MONO_OBJECT_SETREF (setup, application_base, mono_string_new_utf16 (data, mono_string_chars (root->setup->application_base), mono_string_length (root->setup->application_base)));
+               if (root->setup->application_base) {
+                       MonoString *s = mono_string_new_utf16_checked (data, mono_string_chars (root->setup->application_base), mono_string_length (root->setup->application_base), error);
+                       mono_error_assert_ok (error); /* FIXME don't swallow the error */
+                       MONO_OBJECT_SETREF (setup, application_base, s);
+               }
        }
 
        mono_context_init (data);
 
-       data->setup = copy_app_domain_setup (data, setup);
+       data->setup = copy_app_domain_setup (data, setup, error);
+       if (!mono_error_ok (error)) {
+               g_free (data->friendly_name);
+               return NULL;
+       }
+
        mono_domain_set_options_from_config (data);
        add_assemblies_to_domain (data, mono_defaults.corlib->assembly, NULL);
 
 #ifndef DISABLE_SHADOW_COPY
        /*FIXME, guard this for when the debugger is not running */
-       shadow_location = get_shadow_assembly_location_base (data, &error);
-       if (!mono_error_ok (&error))
-               mono_error_raise_exception (&error);
+       shadow_location = get_shadow_assembly_location_base (data, error);
+       if (!mono_error_ok (error)) {
+               g_free (data->friendly_name);
+               return NULL;
+       }
+
        g_free (shadow_location);
 #endif
 
@@ -510,7 +542,7 @@ mono_domain_create_appdomain_internal (char *friendly_name, MonoAppDomainSetup *
  * mono_domain_has_type_resolve:
  * @domain: application domains being looked up
  *
- * Returns true if the AppDomain.TypeResolve field has been
+ * Returns: TRUE if the AppDomain.TypeResolve field has been
  * set.
  */
 gboolean
@@ -548,6 +580,8 @@ mono_domain_has_type_resolve (MonoDomain *domain)
 MonoReflectionAssembly *
 mono_domain_try_type_resolve (MonoDomain *domain, char *name, MonoObject *tb)
 {
+       MonoError error;
+       MonoReflectionAssembly *ret;
        MonoClass *klass;
        void *params [1];
        static MonoMethod *method = NULL;
@@ -569,7 +603,11 @@ mono_domain_try_type_resolve (MonoDomain *domain, char *name, MonoObject *tb)
                *params = (MonoObject*)mono_string_new (mono_domain_get (), name);
        else
                *params = tb;
-       return (MonoReflectionAssembly *) mono_runtime_invoke (method, domain->domain, params, NULL);
+
+       ret = (MonoReflectionAssembly *) mono_runtime_invoke_checked (method, domain->domain, params, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
+
+       return ret;
 }
 
 /**
@@ -864,11 +902,17 @@ ves_icall_System_AppDomain_createDomain (MonoString *friendly_name, MonoAppDomai
        mono_set_pending_exception (mono_get_exception_not_supported ("AppDomain creation is not supported on this runtime."));
        return NULL;
 #else
-       char *fname = mono_string_to_utf8 (friendly_name);
-       MonoAppDomain *ad = mono_domain_create_appdomain_internal (fname, setup);
-       
+       MonoError error;
+       char *fname;
+       MonoAppDomain *ad;
+
+       fname = mono_string_to_utf8 (friendly_name);
+       ad = mono_domain_create_appdomain_internal (fname, setup, &error);
+
        g_free (fname);
 
+       mono_error_raise_exception (&error);
+
        return ad;
 #endif
 }
@@ -876,6 +920,7 @@ ves_icall_System_AppDomain_createDomain (MonoString *friendly_name, MonoAppDomai
 MonoArray *
 ves_icall_System_AppDomain_GetAssemblies (MonoAppDomain *ad, MonoBoolean refonly)
 {
+       MonoError error;
        MonoDomain *domain = ad->data; 
        MonoAssembly* ass;
        static MonoClass *System_Reflection_Assembly;
@@ -884,6 +929,8 @@ ves_icall_System_AppDomain_GetAssemblies (MonoAppDomain *ad, MonoBoolean refonly
        int i;
        GPtrArray *assemblies;
 
+       mono_error_init (&error);
+       
        if (!System_Reflection_Assembly)
                System_Reflection_Assembly = mono_class_from_name (
                        mono_defaults.corlib, "System.Reflection", "Assembly");
@@ -908,22 +955,30 @@ ves_icall_System_AppDomain_GetAssemblies (MonoAppDomain *ad, MonoBoolean refonly
        res = mono_array_new (domain, System_Reflection_Assembly, assemblies->len);
        for (i = 0; i < assemblies->len; ++i) {
                ass = (MonoAssembly *)g_ptr_array_index (assemblies, i);
-               mono_array_setref (res, i, mono_assembly_get_object (domain, ass));
+               MonoReflectionAssembly *ass_obj = mono_assembly_get_object_checked (domain, ass, &error);
+               if (!mono_error_ok (&error))
+                       goto leave;
+               mono_array_setref (res, i, ass_obj);
        }
 
+leave:
        g_ptr_array_free (assemblies, TRUE);
-
+       if (!mono_error_ok (&error))
+               mono_error_set_pending_exception (&error);
        return res;
 }
 
 MonoReflectionAssembly *
-mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, MonoAssembly *requesting, gboolean refonly)
+mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, MonoAssembly *requesting, gboolean refonly, MonoError *error)
 {
+       MonoReflectionAssembly *ret;
        MonoClass *klass;
        MonoMethod *method;
        MonoBoolean isrefonly;
        gpointer params [3];
 
+       mono_error_init (error);
+
        if (mono_runtime_get_no_exec ())
                return NULL;
 
@@ -940,15 +995,24 @@ mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, MonoAssembly *
 
        isrefonly = refonly ? 1 : 0;
        params [0] = fname;
-       params [1] = (requesting) ? mono_assembly_get_object (domain, requesting) : NULL;
+       if (requesting) {
+               params[1] = mono_assembly_get_object_checked (domain, requesting, error);
+               return_val_if_nok (error, NULL);
+       } else
+               params [1] = NULL;
        params [2] = &isrefonly;
-       return (MonoReflectionAssembly *) mono_runtime_invoke (method, domain->domain, params, NULL);
+
+       ret = (MonoReflectionAssembly *) mono_runtime_invoke_checked (method, domain->domain, params, error);
+       return_val_if_nok (error, NULL);
+
+       return ret;
 }
 
 MonoAssembly *
 mono_domain_assembly_postload_search (MonoAssemblyName *aname, MonoAssembly *requesting,
                                                                          gboolean refonly)
 {
+       MonoError error;
        MonoReflectionAssembly *assembly;
        MonoDomain *domain = mono_domain_get ();
        char *aname_str;
@@ -962,7 +1026,13 @@ mono_domain_assembly_postload_search (MonoAssemblyName *aname, MonoAssembly *req
                g_free (aname_str);
                return NULL;
        }
-       assembly = mono_try_assembly_resolve (domain, str, requesting, refonly);
+
+       assembly = mono_try_assembly_resolve (domain, str, requesting, refonly, &error);
+       if (!mono_error_ok (&error)) {
+               g_free (aname_str);
+               mono_error_raise_exception (&error); /* FIXME don't raise here */
+       }
+
        g_free (aname_str);
 
        if (assembly)
@@ -1017,6 +1087,7 @@ mono_domain_fire_assembly_load (MonoAssembly *assembly, gpointer user_data)
 {
        static MonoClassField *assembly_load_field;
        static MonoMethod *assembly_load_method;
+       MonoError error;
        MonoDomain *domain = mono_domain_get ();
        MonoReflectionAssembly *ref_assembly;
        MonoClass *klass;
@@ -1046,8 +1117,8 @@ mono_domain_fire_assembly_load (MonoAssembly *assembly, gpointer user_data)
                return;
        }
 
-       ref_assembly = mono_assembly_get_object (domain, assembly);
-       g_assert (ref_assembly);
+       ref_assembly = mono_assembly_get_object_checked (domain, assembly, &error);
+       mono_error_assert_ok (&error);
 
        if (assembly_load_method == NULL) {
                assembly_load_method = mono_class_get_method_from_name (klass, "DoAssemblyLoad", -1);
@@ -1055,7 +1126,9 @@ mono_domain_fire_assembly_load (MonoAssembly *assembly, gpointer user_data)
        }
 
        *params = ref_assembly;
-       mono_runtime_invoke (assembly_load_method, domain->domain, params, NULL);
+
+       mono_runtime_invoke_checked (assembly_load_method, domain->domain, params, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
 }
 
 /*
@@ -1249,8 +1322,9 @@ mono_is_shadow_copy_enabled (MonoDomain *domain, const gchar *dir_name)
 }
 
 char *
-mono_make_shadow_copy (const char *filename)
+mono_make_shadow_copy (const char *filename, MonoError *error)
 {
+       mono_error_init (error);
        return (char *) filename;
 }
 #else
@@ -1328,8 +1402,8 @@ get_shadow_assembly_location_base (MonoDomain *domain, MonoError *error)
        setup = domain->setup;
        if (setup->cache_path != NULL && setup->application_name != NULL) {
                cache_path = mono_string_to_utf8_checked (setup->cache_path, error);
-               if (!mono_error_ok (error))
-                       return NULL;
+               return_val_if_nok (error, NULL);
+
 #ifndef TARGET_WIN32
                {
                        gint i;
@@ -1628,7 +1702,7 @@ or NULL if source file not found.
 FIXME bubble up the error instead of raising it here
 */
 char *
-mono_make_shadow_copy (const char *filename)
+mono_make_shadow_copy (const char *filename, MonoError *oerror)
 {
        MonoError error;
        gchar *sibling_source, *sibling_target;
@@ -1637,13 +1711,14 @@ mono_make_shadow_copy (const char *filename)
        guint32 attrs;
        char *shadow;
        gboolean copy_result;
-       MonoException *exc;
        struct stat src_sbuf;
        struct utimbuf utbuf;
        char *dir_name = g_path_get_dirname (filename);
        MonoDomain *domain = mono_domain_get ();
        char *shadow_dir;
 
+       mono_error_init (oerror);
+
        set_domain_search_path (domain);
 
        if (!mono_is_shadow_copy_enabled (domain, dir_name)) {
@@ -1656,8 +1731,8 @@ mono_make_shadow_copy (const char *filename)
        if (!mono_error_ok (&error)) {
                mono_error_cleanup (&error);
                g_free (dir_name);
-               exc = mono_get_exception_execution_engine ("Failed to create shadow copy (invalid characters in shadow directory name).");
-               mono_raise_exception (exc);
+               mono_error_set_generic_error (oerror, "System", "ExecutionEngineException", "Failed to create shadow copy (invalid characters in shadow directory name).");
+               return NULL;
        }
 
        if (strstr (dir_name, shadow_dir)) {
@@ -1671,14 +1746,14 @@ mono_make_shadow_copy (const char *filename)
        shadow = get_shadow_assembly_location (filename, &error);
        if (!mono_error_ok (&error)) {
                mono_error_cleanup (&error);
-               exc = mono_get_exception_execution_engine ("Failed to create shadow copy (invalid characters in file name).");
-               mono_raise_exception (exc);
+               mono_error_set_generic_error (oerror, "System", "ExecutionEngineException", "Failed to create shadow copy (invalid characters in file name).");
+               return NULL;
        }
 
        if (ensure_directory_exists (shadow) == FALSE) {
                g_free (shadow);
-               exc = mono_get_exception_execution_engine ("Failed to create shadow copy (ensure directory exists).");
-               mono_raise_exception (exc);
+               mono_error_set_generic_error (oerror, "System", "ExecutionEngineException", "Failed to create shadow copy (ensure directory exists).");
+               return NULL;
        }       
 
        if (!private_file_needs_copying (filename, &src_sbuf, shadow))
@@ -1714,8 +1789,8 @@ mono_make_shadow_copy (const char *filename)
                if (GetLastError() == ERROR_FILE_NOT_FOUND || GetLastError() == ERROR_PATH_NOT_FOUND)
                        return NULL; /* file not found, shadow copy failed */
 
-               exc = mono_get_exception_execution_engine ("Failed to create shadow copy (CopyFile).");
-               mono_raise_exception (exc);
+               mono_error_set_generic_error (oerror, "System", "ExecutionEngineException", "Failed to create shadow copy (CopyFile).");
+               return NULL;
        }
 
        /* attempt to copy .mdb, .config if they exist */
@@ -1733,15 +1808,15 @@ mono_make_shadow_copy (const char *filename)
        
        if (copy_result == FALSE)  {
                g_free (shadow);
-               exc = mono_get_exception_execution_engine ("Failed to create shadow copy of sibling data (CopyFile).");
-               mono_raise_exception (exc);
+               mono_error_set_generic_error (oerror, "System", "ExecutionEngineException", "Failed to create shadow copy of sibling data (CopyFile).");
+               return NULL;
        }
 
        /* Create a .ini file containing the original assembly location */
        if (!shadow_copy_create_ini (shadow, filename)) {
                g_free (shadow);
-               exc = mono_get_exception_execution_engine ("Failed to create shadow copy .ini file.");
-               mono_raise_exception (exc);
+               mono_error_set_generic_error (oerror, "System", "ExecutionEngineException", "Failed to create shadow copy .ini file.");
+               return NULL;
        }
 
        utbuf.actime = src_sbuf.st_atime;
@@ -1898,6 +1973,8 @@ mono_domain_assembly_search (MonoAssemblyName *aname,
 MonoReflectionAssembly *
 ves_icall_System_Reflection_Assembly_LoadFrom (MonoString *fname, MonoBoolean refOnly)
 {
+       MonoError error;
+       MonoReflectionAssembly *result;
        MonoDomain *domain = mono_domain_get ();
        char *name, *filename;
        MonoImageOpenStatus status = MONO_IMAGE_OK;
@@ -1927,7 +2004,10 @@ ves_icall_System_Reflection_Assembly_LoadFrom (MonoString *fname, MonoBoolean re
 
        g_free (name);
 
-       return mono_assembly_get_object (domain, ass);
+       result = mono_assembly_get_object_checked (domain, ass, &error);
+       if (!result)
+               mono_error_set_pending_exception (&error);
+       return result;
 }
 
 MonoReflectionAssembly *
@@ -1936,6 +2016,7 @@ ves_icall_System_AppDomain_LoadAssemblyRaw (MonoAppDomain *ad,
                                            MonoArray *raw_symbol_store, MonoObject *evidence,
                                            MonoBoolean refonly)
 {
+       MonoError error;
        MonoAssembly *ass;
        MonoReflectionAssembly *refass = NULL;
        MonoDomain *domain = ad->data;
@@ -1960,14 +2041,18 @@ ves_icall_System_AppDomain_LoadAssemblyRaw (MonoAppDomain *ad,
                return NULL; 
        }
 
-       refass = mono_assembly_get_object (domain, ass);
-       MONO_OBJECT_SETREF (refass, evidence, evidence);
+       refass = mono_assembly_get_object_checked (domain, ass, &error);
+       if (!refass)
+               mono_error_set_pending_exception (&error);
+       else
+               MONO_OBJECT_SETREF (refass, evidence, evidence);
        return refass;
 }
 
 MonoReflectionAssembly *
 ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad,  MonoString *assRef, MonoObject *evidence, MonoBoolean refOnly)
 {
+       MonoError error;
        MonoDomain *domain = ad->data; 
        MonoImageOpenStatus status = MONO_IMAGE_OK;
        MonoAssembly *ass;
@@ -1984,8 +2069,13 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad,  MonoString *assRef,
 
        if (!parsed) {
                /* This is a parse error... */
-               if (!refOnly)
-                       refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly);
+               if (!refOnly) {
+                       refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly, &error);
+                       if (!mono_error_ok (&error)) {
+                               mono_error_set_pending_exception (&error);
+                               return NULL;
+                       }
+               }
                return refass;
        }
 
@@ -1994,8 +2084,13 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad,  MonoString *assRef,
 
        if (!ass) {
                /* MS.NET doesn't seem to call the assembly resolve handler for refonly assemblies */
-               if (!refOnly)
-                       refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly);
+               if (!refOnly) {
+                       refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly, &error);
+                       if (!mono_error_ok (&error)) {
+                               mono_error_set_pending_exception (&error);
+                               return NULL;
+                       }
+               }
                else
                        refass = NULL;
                if (!refass) {
@@ -2004,9 +2099,12 @@ ves_icall_System_AppDomain_LoadAssembly (MonoAppDomain *ad,  MonoString *assRef,
        }
 
        if (refass == NULL)
-               refass = mono_assembly_get_object (domain, ass);
+               refass = mono_assembly_get_object_checked (domain, ass, &error);
 
-       MONO_OBJECT_SETREF (refass, evidence, evidence);
+       if (refass == NULL)
+               mono_error_set_pending_exception (&error);
+       else
+               MONO_OBJECT_SETREF (refass, evidence, evidence);
        return refass;
 }
 
@@ -2170,7 +2268,11 @@ ves_icall_System_AppDomain_InternalGetProcessGuid (MonoString* newguid)
        mono_domain_lock (mono_root_domain);
        if (process_guid_set) {
                mono_domain_unlock (mono_root_domain);
-               return mono_string_new_utf16 (mono_domain_get (), process_guid, sizeof(process_guid)/2);
+               MonoError error;
+               MonoString *res = NULL;
+               res = mono_string_new_utf16_checked (mono_domain_get (), process_guid, sizeof(process_guid)/2, &error);
+               mono_error_raise_exception (&error);
+               return res;
        }
        memcpy (process_guid, mono_string_chars(newguid), sizeof(process_guid));
        process_guid_set = TRUE;
@@ -2281,6 +2383,7 @@ deregister_reflection_info_roots (MonoDomain *domain)
 static guint32 WINAPI
 unload_thread_main (void *arg)
 {
+       MonoError error;
        unload_data *data = (unload_data*)arg;
        MonoDomain *domain = data->domain;
        MonoThread *thread;
@@ -2288,7 +2391,8 @@ unload_thread_main (void *arg)
 
        /* Have to attach to the runtime so shutdown can wait for this thread */
        /* Force it to be attached to avoid racing during shutdown. */
-       thread = mono_thread_attach_full (mono_get_root_domain (), TRUE);
+       thread = mono_thread_attach_full (mono_get_root_domain (), TRUE, &error);
+       mono_error_raise_exception (&error); /* FIXME don't raise here */
 
        /* 
         * FIXME: Abort our parent thread last, so we can return a failure 
@@ -2415,6 +2519,7 @@ guarded_wait (HANDLE handle, guint32 timeout, gboolean alertable)
 void
 mono_domain_try_unload (MonoDomain *domain, MonoObject **exc)
 {
+       MonoError error;
        HANDLE thread_handle;
        MonoAppDomainState prev_state;
        MonoMethod *method;
@@ -2449,7 +2554,15 @@ mono_domain_try_unload (MonoDomain *domain, MonoObject **exc)
        method = mono_class_get_method_from_name (domain->domain->mbr.obj.vtable->klass, "DoDomainUnload", -1); 
        g_assert (method);
 
-       mono_runtime_invoke (method, domain->domain, NULL, exc);
+       mono_runtime_try_invoke (method, domain->domain, NULL, exc, &error);
+
+       if (!mono_error_ok (&error)) {
+               if (*exc)
+                       mono_error_cleanup (&error);
+               else
+                       *exc = (MonoObject*)mono_error_convert_to_exception (&error);
+       }
+
        if (*exc) {
                /* Roll back the state change */
                domain->state = MONO_APPDOMAIN_CREATED;