}
static char *
-default_assembly_name_resolver (const char *name)
+default_assembly_name_resolver (const char *base_dir, const char *name)
{
char *file, *path;
(strcmp (name, "corlib") == 0))
return g_concat_dir_and_file (MONO_ASSEMBLIES, CORLIB_NAME);
+ path = g_concat_dir_and_file (base_dir, name);
if (g_file_test (name, G_FILE_TEST_EXISTS))
- return g_strdup (name);
+ return path;
+
+ file = path;
+ path = g_strconcat (file, ".dll", NULL);
+ g_free (file);
+ if (g_file_test (path, G_FILE_TEST_EXISTS))
+ return path;
+ g_free (path);
+
path = g_concat_dir_and_file (MONO_ASSEMBLIES, name);
if (g_file_test (path, G_FILE_TEST_EXISTS))
- return g_strdup (path);
+ return path;
g_free (path);
+
file = g_strconcat (name, ".dll", NULL);
path = g_concat_dir_and_file (MONO_ASSEMBLIES, file);
g_free (file);
MonoImage *image;
MonoTableInfo *t;
int i;
- char *fullname;
- const char *basename = strrchr (filename, G_DIR_SEPARATOR);
+ char *fullname, *base_dir;
+ const char *base_name = strrchr (filename, G_DIR_SEPARATOR);
static MonoAssembly *corlib;
g_return_val_if_fail (filename != NULL, NULL);
return ass;
}
- if (basename == NULL)
- basename = filename;
+ if (base_name == NULL)
+ base_name = filename;
else
- basename++;
+ base_name++;
if (resolver == NULL)
resolver = default_assembly_name_resolver;
-
- fullname = resolver (filename);
+ base_dir = g_path_get_dirname (fullname);
+
+ fullname = resolver (base_dir, filename);
image = mono_image_open (fullname, status);
if (!image){
if (status)
*status = MONO_IMAGE_ERROR_ERRNO;
g_free (fullname);
+ g_free (base_dir);
return NULL;
}
* ie, references to mscorlib from corlib.dll are ignored
* and we do not load corlib twice.
*/
- if (strcmp (basename, CORLIB_NAME) == 0){
+ if (strcmp (base_name, CORLIB_NAME) == 0){
if (corlib == NULL)
corlib = ass;
continue;
}
- assembly_ref = (*resolver) (name);
+ assembly_ref = (*resolver) (base_dir, name);
image->references [i] = mono_assembly_open (assembly_ref, resolver, status);
if (status)
*status = MONO_IMAGE_MISSING_ASSEMBLYREF;
g_free (ass);
+ g_free (base_dir);
return NULL;
}
g_free (assembly_ref);
}
image->references [i] = NULL;
+ g_free (base_dir);
return ass;
}