2004-09-09 Martin Baulig <martin@ximian.com>
[mono.git] / mono / metadata / assembly.c
index 52ff34f542c5a3efb7f174d6dcdf8fc1ed870604..8025039b6f4a51c115bfce0e05c8fe09fe95b8cb 100644 (file)
@@ -23,6 +23,7 @@
 #include <mono/metadata/loader.h>
 #include <mono/metadata/tabledefs.h>
 #include <mono/metadata/metadata-internals.h>
+#include <mono/metadata/domain-internals.h>
 #include <mono/io-layer/io-layer.h>
 #include <mono/utils/mono-uri.h>
 #include <mono/metadata/mono-config.h>
@@ -270,9 +271,10 @@ mono_assembly_fill_assembly_name (MonoImage *image, MonoAssemblyName *aname)
        if (cols [MONO_ASSEMBLY_PUBLIC_KEY]) {
                gchar* token = g_malloc (8);
                gchar* encoded;
+               int len;
 
                aname->public_key = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLY_PUBLIC_KEY]);
-               int len = mono_metadata_decode_blob_size (aname->public_key, &aname->public_key);
+               len = mono_metadata_decode_blob_size (aname->public_key, (const char**)&aname->public_key);
 
                mono_digest_get_public_token (token, aname->public_key, len);
                encoded = encode_public_tok (token, 8);
@@ -387,6 +389,15 @@ mono_assembly_load_references (MonoImage *image, MonoImageOpenStatus *status)
                                                 image->name, aname.name);
                                
                        } else {
+                               char *extra_msg = g_strdup ("");
+
+                               if (*status == MONO_IMAGE_ERROR_ERRNO) {
+                                       extra_msg = g_strdup_printf ("System error: %s\n", strerror (errno));
+                               } else if (*status == MONO_IMAGE_MISSING_ASSEMBLYREF) {
+                                       extra_msg = g_strdup ("Cannot find an assembly referenced from this one.\n");
+                               } else if (*status == MONO_IMAGE_IMAGE_INVALID) {
+                                       extra_msg = g_strdup ("The file exists but is not a valid assembly.\n");
+                               }
                        
                                for (j = 0; j < i; j++)
                                        mono_assembly_close (references [j]);
@@ -395,11 +406,12 @@ mono_assembly_load_references (MonoImage *image, MonoImageOpenStatus *status)
                                g_warning ("Could not find assembly %s, references from %s (assemblyref_index=%d)\n"
                                           "     Major/Minor: %d,%d\n"
                                           "     Build:       %d,%d\n"
-                                          "     Token:       %s\n",
+                                          "     Token:       %s\n%s",
                                           aname.name, image->name, i,
                                           aname.major, aname.minor, aname.build, aname.revision,
-                                          aname.public_key_token);
+                                          aname.public_key_token, extra_msg);
                                *status = MONO_IMAGE_MISSING_ASSEMBLYREF;
+                               g_free (extra_msg);
                                return;
                        }
                }
@@ -879,7 +891,7 @@ mono_assembly_load_from_gac (MonoAssemblyName *aname,  gchar *filename, MonoImag
        gint32 len;
        gchar **paths;
 
-       if (aname->public_key_token [0] == NULL) {
+       if (aname->public_key_token [0] == 0) {
                return NULL;
        }
 
@@ -956,6 +968,7 @@ mono_assembly_load (MonoAssemblyName *aname, const char *basedir, MonoImageOpenS
        /* g_print ("loading %s\n", aname->name); */
        /* special case corlib */
        if (strcmp (aname->name, "mscorlib") == 0) {
+               char *corlib_file;
                if (corlib) {
                        /* g_print ("corlib already loaded\n"); */
                        return corlib;
@@ -967,6 +980,23 @@ mono_assembly_load (MonoAssemblyName *aname, const char *basedir, MonoImageOpenS
                                return corlib;
                }
                corlib = load_in_path ("mscorlib.dll", default_path, status);
+
+               if (corlib)
+                       return corlib;
+       
+               /* Load corlib from mono/<version> */
+               
+               corlib_file = g_build_filename ("mono", mono_get_framework_version (), "mscorlib.dll", NULL);
+               if (assemblies_path) {
+                       corlib = load_in_path (corlib_file, (const char**)assemblies_path, status);
+                       if (corlib) {
+                               g_free (corlib_file);
+                               return corlib;
+                       }
+               }
+               corlib = load_in_path (corlib_file, default_path, status);
+               g_free (corlib_file);
+       
                return corlib;
        }
 
@@ -1092,4 +1122,3 @@ mono_assembly_get_image (MonoAssembly *assembly)
 {
        return assembly->image;
 }
-