X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fassembly.c;h=61b4c3416523eb3a19ba77dc0ae51ad0e1a181ce;hb=8cbeea47672e9d872345d869fc4ccd784ad5d8b7;hp=cae45aa64abde017a5223bcb5ecbc25dda2fa3da;hpb=be95f699da177f6e2d13937062b8c6eca449104f;p=mono.git diff --git a/mono/metadata/assembly.c b/mono/metadata/assembly.c index cae45aa64ab..61b4c341652 100644 --- a/mono/metadata/assembly.c +++ b/mono/metadata/assembly.c @@ -799,7 +799,7 @@ mono_assembly_binding_unlock (void) } gboolean -mono_assembly_fill_assembly_name (MonoImage *image, MonoAssemblyName *aname) +mono_assembly_fill_assembly_name_full (MonoImage *image, MonoAssemblyName *aname, gboolean copyBlobs) { MonoTableInfo *t = &image->tables [MONO_TABLE_ASSEMBLY]; guint32 cols [MONO_ASSEMBLY_SIZE]; @@ -813,7 +813,11 @@ mono_assembly_fill_assembly_name (MonoImage *image, MonoAssemblyName *aname) aname->hash_len = 0; aname->hash_value = NULL; aname->name = mono_metadata_string_heap (image, cols [MONO_ASSEMBLY_NAME]); + if (copyBlobs) + aname->name = g_strdup (aname->name); aname->culture = mono_metadata_string_heap (image, cols [MONO_ASSEMBLY_CULTURE]); + if (copyBlobs) + aname->culture = g_strdup (aname->culture); aname->flags = cols [MONO_ASSEMBLY_FLAGS]; aname->major = cols [MONO_ASSEMBLY_MAJOR_VERSION]; aname->minor = cols [MONO_ASSEMBLY_MINOR_VERSION]; @@ -844,6 +848,16 @@ mono_assembly_fill_assembly_name (MonoImage *image, MonoAssemblyName *aname) if (cols [MONO_ASSEMBLY_PUBLIC_KEY]) { aname->public_key = (guchar*)mono_metadata_blob_heap (image, cols [MONO_ASSEMBLY_PUBLIC_KEY]); + if (copyBlobs) { + const gchar *pkey_end; + int len = mono_metadata_decode_blob_size ((const gchar*) aname->public_key, &pkey_end); + pkey_end += len; /* move to end */ + size_t size = pkey_end - (const gchar*)aname->public_key; + guchar *tmp = g_new (guchar, size); + memcpy (tmp, aname->public_key, size); + aname->public_key = tmp; + } + } else aname->public_key = 0; @@ -876,6 +890,12 @@ mono_assembly_fill_assembly_name (MonoImage *image, MonoAssemblyName *aname) return TRUE; } +gboolean +mono_assembly_fill_assembly_name (MonoImage *image, MonoAssemblyName *aname) +{ + return mono_assembly_fill_assembly_name_full (image, aname, FALSE); +} + /** * mono_stringify_assembly_name: * @aname: the assembly name. @@ -1227,7 +1247,7 @@ mono_assembly_load_reference (MonoImage *image, int index) image->assembly->aname.name, image->assembly, reference->aname.name, reference, reference->ref_count); } else { if (image->assembly) - mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Failed to load assembly %s[%p]\n", + mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Failed to load assembly %s[%p].", image->assembly->aname.name, image->assembly); } @@ -2703,27 +2723,21 @@ mono_assembly_load_with_partial_name (const char *name, MonoImageOpenStatus *sta res = probe_for_partial_name (gacpath, fullname, aname, status); g_free (gacpath); + g_free (fullname); + mono_assembly_name_free (aname); + if (res) res->in_gac = TRUE; else { MonoDomain *domain = mono_domain_get (); - MonoReflectionAssembly *refasm; - refasm = mono_try_assembly_resolve (domain, mono_string_new (domain, name), NULL, FALSE, &error); + res = mono_try_assembly_resolve (domain, name, NULL, FALSE, &error); if (!is_ok (&error)) { - g_free (fullname); - mono_assembly_name_free (aname); mono_error_cleanup (&error); if (*status == MONO_IMAGE_OK) *status = MONO_IMAGE_IMAGE_INVALID; } - - if (refasm) - res = refasm->assembly; } - - g_free (fullname); - mono_assembly_name_free (aname); return res; }