#include <mono/metadata/class-internals.h>
#include <mono/metadata/domain-internals.h>
#include <mono/metadata/mono-endian.h>
+#include <mono/metadata/mono-debug.h>
#include <mono/io-layer/io-layer.h>
#include <mono/utils/mono-uri.h>
#include <mono/metadata/mono-config.h>
{"Mono.Cairo", 0},
{"Mono.CompilerServices.SymbolWriter", 0},
{"Mono.Data", 0},
- {"Mono.Data.SqliteClient", 0},
{"Mono.Data.SybaseClient", 0},
{"Mono.Data.Tds", 0},
{"Mono.Data.TdsClient", 0},
* it inside a critical section.
*/
mono_assemblies_lock ();
+ if (!image->references)
+ mono_assembly_load_references (image, &status);
reference = image->references [index];
mono_assemblies_unlock ();
if (reference)
mono_assembly_load_references (MonoImage *image, MonoImageOpenStatus *status)
{
MonoTableInfo *t;
- int i;
*status = MONO_IMAGE_OK;
t = &image->tables [MONO_TABLE_ASSEMBLYREF];
image->references = g_new0 (MonoAssembly *, t->rows + 1);
-
- /* resolve assembly references for modules */
- for (i = 0; i < image->module_count; i++){
- if (image->modules [i]) {
- image->modules [i]->assembly = image->assembly;
- mono_assembly_load_references (image->modules [i], status);
- }
- }
}
typedef struct AssemblyLoadHook AssemblyLoadHook;
}
/*
- * load_friend_assemblies:
+ * mono_load_friend_assemblies:
* @ass: an assembly
*
* Load the list of friend assemblies that are allowed to access
* the assembly's internal types and members. They are stored as assembly
* names in custom attributes.
+ *
+ * This is an internal method, we need this because when we load mscorlib
+ * we do not have the mono_defaults.internals_visible_class loaded yet,
+ * so we need to load these after we initialize the runtime.
*/
-static void
-load_friend_assemblies (MonoAssembly* ass)
+void
+mono_assembly_load_friends (MonoAssembly* ass)
{
int i;
MonoCustomAttrInfo* attrs = mono_custom_attrs_from_assembly (ass);
loaded_assemblies = g_list_prepend (loaded_assemblies, ass);
if (mono_defaults.internals_visible_class)
- load_friend_assemblies (ass);
+ mono_assembly_load_friends (ass);
mono_assemblies_unlock ();
mono_assembly_invoke_load_hook (ass);
tmp++;
continue;
}
-
+
+ if (!g_ascii_strncasecmp (value, "ProcessorArchitecture=", 22)) {
+ /* this is ignored for now, until we can change MonoAssemblyName */
+ tmp++;
+ continue;
+ }
+
g_strfreev (parts);
return FALSE;
}
while ((direntry = g_dir_read_name (dirhandle))) {
gboolean match = TRUE;
- parse_assembly_directory_name (aname->name, direntry, &gac_aname);
+ if(!parse_assembly_directory_name (aname->name, direntry, &gac_aname))
+ continue;
if (aname->culture != NULL && strcmp (aname->culture, gac_aname.culture) != 0)
match = FALSE;
mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Unloading assembly %s [%p].", assembly->aname.name, assembly);
+ mono_debug_close_image (assembly->image);
+
mono_assemblies_lock ();
loaded_assemblies = g_list_remove (loaded_assemblies, assembly);
mono_assemblies_unlock ();
- if (assembly->image->references) {
- int i;
-
- for (i = 0; assembly->image->references [i]; i++) {
- if (assembly->image->references [i])
- mono_assembly_close (assembly->image->references [i]);
- }
-
- g_free (assembly->image->references);
- assembly->image->references = NULL;
- }
-
assembly->image->assembly = NULL;
mono_image_close (assembly->image);