aname->revision = cols [MONO_ASSEMBLY_REV_NUMBER];
aname->hash_alg = cols [MONO_ASSEMBLY_HASH_ALG];
if (cols [MONO_ASSEMBLY_PUBLIC_KEY]) {
- gchar* token = g_malloc (8);
+ guchar* token = g_malloc (8);
gchar* encoded;
+ const gchar* pkey;
int len;
- aname->public_key = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLY_PUBLIC_KEY]);
- len = mono_metadata_decode_blob_size (aname->public_key, (const char**)&aname->public_key);
+ pkey = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLY_PUBLIC_KEY]);
+ len = mono_metadata_decode_blob_size (pkey, &pkey);
+ aname->public_key = (guchar*)pkey;
mono_digest_get_public_token (token, aname->public_key, len);
encoded = encode_public_tok (token, 8);
- g_strlcpy (aname->public_key_token, encoded, MONO_PUBLIC_KEY_TOKEN_LENGTH);
+ g_strlcpy ((char*)aname->public_key_token, encoded, MONO_PUBLIC_KEY_TOKEN_LENGTH);
g_free (encoded);
g_free (token);
}
if (cols [MONO_ASSEMBLY_PUBLIC_KEY]) {
- aname->public_key = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLY_PUBLIC_KEY]);
+ aname->public_key = (guchar*)mono_metadata_blob_heap (image, cols [MONO_ASSEMBLY_PUBLIC_KEY]);
}
else
aname->public_key = 0;
len = mono_metadata_decode_blob_size (public_tok, &public_tok);
if (flags & ASSEMBLYREF_FULL_PUBLIC_KEY_FLAG) {
- gchar token [8];
- mono_digest_get_public_token (token, public_tok, len);
+ guchar token [8];
+ mono_digest_get_public_token (token, (guchar*)public_tok, len);
return encode_public_tok (token, 8);
}
- return encode_public_tok (public_tok, len);
+ return encode_public_tok ((guchar*)public_tok, len);
}
/**
if (cols [MONO_ASSEMBLYREF_PUBLIC_KEY]) {
gchar *token = assemblyref_public_tok (image, cols [MONO_ASSEMBLYREF_PUBLIC_KEY], aname->flags);
- g_strlcpy (aname->public_key_token, token, MONO_PUBLIC_KEY_TOKEN_LENGTH);
+ g_strlcpy ((char*)aname->public_key_token, token, MONO_PUBLIC_KEY_TOKEN_LENGTH);
g_free (token);
} else {
memset (aname->public_key_token, 0, MONO_PUBLIC_KEY_TOKEN_LENGTH);
* 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_get_assemblyref (image, index, &aname);
- if (image->assembly->ref_only) {
+ if (image->assembly && image->assembly->ref_only) {
/* We use the loaded corlib */
if (!strcmp (aname.name, "mscorlib"))
reference = mono_assembly_load_full (&aname, image->assembly->basedir, &status, FALSE);
if (!reference)
reference = REFERENCE_MISSING;
} else
- reference = mono_assembly_load (&aname, image->assembly->basedir, &status);
+ reference = mono_assembly_load (&aname, image->assembly? image->assembly->basedir: NULL, &status);
if (reference == NULL){
char *extra_msg = g_strdup ("");
" Public Key: %s\n%s",
image->name, aname.name, index,
aname.major, aname.minor, aname.build, aname.revision,
- strlen(aname.public_key_token) == 0 ? "(none)" : (char*)aname.public_key_token, extra_msg);
+ strlen ((char*)aname.public_key_token) == 0 ? "(none)" : (char*)aname.public_key_token, extra_msg);
g_free (extra_msg);
}
if (!image->references [index]) {
if (reference != REFERENCE_MISSING){
mono_assembly_addref (reference);
- mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Assembly Ref addref %s %p -> %s %p: %d\n",
+ if (image->assembly)
+ mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Assembly Ref addref %s %p -> %s %p: %d\n",
image->assembly->aname.name, image->assembly, reference->aname.name, reference, reference->ref_count);
} else {
- mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Failed to load assembly %s %p\n",
+ if (image->assembly)
+ mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Failed to load assembly %s %p\n",
image->assembly->aname.name, image->assembly);
}
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;
* defined bundles, if found, returns the MonoImage for it, if not found
* returns NULL
*/
-static MonoImage *
+MonoImage *
mono_assembly_open_from_bundle (const char *filename, MonoImageOpenStatus *status, gboolean refonly)
{
int i;
- char *name = g_path_get_basename (filename);
+ char *name;
MonoImage *image = NULL;
/*
* we do a very simple search for bundled assemblies: it's not a general
* purpose assembly loading mechanism.
*/
+
+ if (!bundles)
+ return NULL;
+
+ name = g_path_get_basename (filename);
+
mono_assemblies_lock ();
for (i = 0; !image && bundles [i]; ++i) {
if (strcmp (bundles [i]->name, name) == 0) {
for (i = 0; i < attrs->num_attrs; ++i) {
MonoCustomAttrEntry *attr = &attrs->attrs [i];
MonoAssemblyName *aname;
- const guchar *data;
+ const gchar *data;
guint slen;
/* Do some sanity checking */
if (!attr->ctor || attr->ctor->klass != mono_defaults.internals_visible_class)
continue;
if (attr->data_size < 4)
continue;
- data = attr->data;
+ data = (const char*)attr->data;
/* 0xFF means null string, see custom attr format */
- if (data [0] != 1 || data [1] != 0 || data [2] == 0xFF)
+ if (data [0] != 1 || data [1] != 0 || (data [2] & 0xFF) == 0xFF)
continue;
slen = mono_metadata_decode_value (data + 2, &data);
aname = g_new0 (MonoAssemblyName, 1);
/* avoid loading the same assembly twice for now... */
ass2 = search_loaded (&ass->aname, refonly);
if (ass2) {
+ mono_assemblies_unlock ();
g_free (ass);
g_free (base_dir);
mono_image_close (image);
*status = MONO_IMAGE_OK;
- mono_assemblies_unlock ();
return ass2;
}
}
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;
}