2 * assembly.c: Routines for loading assemblies.
5 * Miguel de Icaza (miguel@ximian.com)
7 * (C) 2001 Ximian, Inc. http://www.ximian.com
10 * Implement big-endian versions of the reading routines.
20 #include "rawbuffer.h"
22 #define CSIZE(x) (sizeof (x) / 4)
25 default_assembly_name_resolver (const char *name)
27 if (strcmp (name, "mscorlib") == 0)
28 return g_strdup (MONO_ASSEMBLIES "/corlib.dll");
30 return g_strconcat (MONO_ASSEMBLIES "/", name, ".dll", NULL);
35 * @filename: Opens the assembly pointed out by this name
36 * @resolver: A user provided function to resolve assembly references
37 * @status: where a status code can be returned
39 * mono_assembly_open opens the PE-image pointed by @filename, and
40 * loads any external assemblies referenced by it.
42 * NOTE: we could do lazy loading of the assemblies. Or maybe not worth
46 mono_assembly_open (const char *filename, MonoAssemblyResolverFn resolver,
47 enum MonoImageOpenStatus *status)
51 metadata_tableinfo_t *t;
52 cli_image_info_t *iinfo;
55 const char *basename = strrchr (filename, '/');
56 static MonoAssembly *corlib;
64 * Temporary hack until we have a complete corlib.dll
66 if (strcmp (basename, "corlib.dll") && corlib != NULL)
69 g_return_val_if_fail (filename != NULL, NULL);
71 image = mono_image_open (filename, status);
74 *status = MONO_IMAGE_ERROR_ERRNO;
79 resolver = default_assembly_name_resolver;
81 iinfo = image->image_info;
82 m = &iinfo->cli_metadata;
83 t = &m->tables [META_TABLE_ASSEMBLYREF];
85 image->references = g_new (MonoAssembly *, t->rows + 1);
87 ass = g_new (MonoAssembly, 1);
91 * Load any assemblies this image references
93 for (i = j = 0; i < t->rows; i++){
98 mono_metadata_decode_row (t, i, cols, CSIZE (cols));
99 name = mono_metadata_string_heap (m, cols [6]);
102 * Special case until we have a passable corlib:
104 * ie, references to mscorlib from corlib.dll are ignored
105 * and we do not load corlib twice.
107 if (strcmp (basename, "corlib.dll") == 0){
108 if (strcmp (name, "mscorlib") == 0)
115 assembly_ref = (*resolver) (name);
117 image->references [i] = mono_assembly_open (assembly_ref, resolver, status);
119 if (image->references [i] == NULL){
122 for (j = 0; j < i; j++)
123 mono_assembly_close (image->references [j]);
124 g_free (image->references);
125 mono_image_close (image);
127 g_warning ("Could not find assembly %s %s", name, assembly_ref);
128 g_free (assembly_ref);
130 *status = MONO_IMAGE_MISSING_ASSEMBLYREF;
134 g_free (assembly_ref);
137 image->references [j] = NULL;
143 mono_assembly_close (MonoAssembly *assembly)
148 g_return_if_fail (assembly != NULL);
150 for (i = 0; image->references [i] != NULL; i++)
151 mono_image_close (assembly->image);
152 g_free (image->references);
154 mono_image_close (assembly->image);