MonoNativeTlsKey loader_lock_nest_id;
static void dllmap_cleanup (void);
+static void cached_module_cleanup(void);
static void
global_loader_data_lock (void)
mono_loader_cleanup (void)
{
dllmap_cleanup ();
+ cached_module_cleanup ();
mono_native_tls_free (loader_lock_nest_id);
mono_class_init (k);
if (retklass)
*retklass = k;
- field = mono_class_get_field (k, token);
- if (!field) {
- mono_error_set_bad_image (error, image, "Could not resolve field token 0x%08x", token);
+ if (mono_class_has_failure (k)) {
+ MonoError causedby_error;
+ error_init (&causedby_error);
+ mono_error_set_for_class_failure (&causedby_error, k);
+ mono_error_set_bad_image (error, image, "Could not resolve field token 0x%08x, due to: %s", token, mono_error_get_message (&causedby_error));
+ mono_error_cleanup (&causedby_error);
+ } else {
+ field = mono_class_get_field (k, token);
+ if (!field) {
+ mono_error_set_bad_image (error, image, "Could not resolve field token 0x%08x", token);
+ }
}
}
g_hash_table_insert (global_module_map, g_strdup (name), module);
}
+static void
+remove_cached_module(gpointer key, gpointer value, gpointer user_data)
+{
+ mono_dl_close((MonoDl*)value);
+}
+
+static void
+cached_module_cleanup(void)
+{
+ if (global_module_map != NULL) {
+ g_hash_table_foreach(global_module_map, remove_cached_module, NULL);
+
+ g_hash_table_destroy(global_module_map);
+ global_module_map = NULL;
+ }
+}
+
static MonoDl *internal_module;
static gboolean