assemblies_loading = g_hash_table_new (NULL, NULL);
}
+gboolean
+mono_assembly_fill_assembly_name (MonoImage *image, MonoAssemblyName *aname)
+{
+ MonoTableInfo *t = &image->tables [MONO_TABLE_ASSEMBLY];
+ guint32 cols [MONO_ASSEMBLY_SIZE];
+
+ if (!t->rows)
+ return FALSE;
+
+ mono_metadata_decode_row (t, 0, cols, MONO_ASSEMBLY_SIZE);
+
+ aname->hash_len = 0;
+ aname->hash_value = NULL;
+ aname->name = mono_metadata_string_heap (image, cols [MONO_ASSEMBLY_NAME]);
+ aname->culture = mono_metadata_string_heap (image, cols [MONO_ASSEMBLY_CULTURE]);
+ aname->flags = cols [MONO_ASSEMBLY_FLAGS];
+ aname->major = cols [MONO_ASSEMBLY_MAJOR_VERSION];
+ aname->minor = cols [MONO_ASSEMBLY_MINOR_VERSION];
+ aname->build = cols [MONO_ASSEMBLY_BUILD_NUMBER];
+ aname->revision = cols [MONO_ASSEMBLY_REV_NUMBER];
+ aname->hash_alg = cols [MONO_ASSEMBLY_HASH_ALG];
+ if (cols [MONO_ASSEMBLY_PUBLIC_KEY])
+ aname->public_key = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLY_PUBLIC_KEY]);
+ else
+ aname->public_key = 0;
+
+ return TRUE;
+}
+
static void
mono_assembly_load_references (MonoImage *image, MonoImageOpenStatus *status)
{
{
MonoAssembly *ass, *ass2;
MonoImage *image;
- MonoTableInfo *t;
- guint32 cols [MONO_ASSEMBLY_SIZE];
char *base_dir;
MonoImageOpenStatus def_status;
gchar *fname;
g_free (fname);
- t = &image->tables [MONO_TABLE_ASSEMBLY];
- if (t->rows) {
- mono_metadata_decode_row (t, 0, cols, MONO_ASSEMBLY_SIZE);
-
- ass->aname.hash_len = 0;
- ass->aname.hash_value = NULL;
- ass->aname.name = mono_metadata_string_heap (image, cols [MONO_ASSEMBLY_NAME]);
- ass->aname.culture = mono_metadata_string_heap (image, cols [MONO_ASSEMBLY_CULTURE]);
- ass->aname.flags = cols [MONO_ASSEMBLY_FLAGS];
- ass->aname.major = cols [MONO_ASSEMBLY_MAJOR_VERSION];
- ass->aname.minor = cols [MONO_ASSEMBLY_MINOR_VERSION];
- ass->aname.build = cols [MONO_ASSEMBLY_BUILD_NUMBER];
- ass->aname.revision = cols [MONO_ASSEMBLY_REV_NUMBER];
- ass->aname.hash_alg = cols [MONO_ASSEMBLY_HASH_ALG];
- if (cols [MONO_ASSEMBLY_PUBLIC_KEY])
- ass->aname.public_key = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLY_PUBLIC_KEY]);
- }
+ mono_assembly_fill_assembly_name (image, &ass->aname);
/*
* Atomically search the loaded list and add ourselves to it if necessary.
}
static void
-ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, MonoReflectionAssemblyName *aname)
+fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute)
{
- MonoAssemblyName *name = &assembly->assembly->aname;
static MonoMethod *create_culture = NULL;
gpointer args [1];
guint32 pkey_len;
const char *pkey_ptr;
- gchar *absolute;
gchar *codebase;
MONO_ARCH_SAVE_REGS;
if (strcmp (name->name, "corlib") == 0)
- aname->name = mono_string_new (mono_object_domain (assembly), "mscorlib");
+ aname->name = mono_string_new (domain, "mscorlib");
else
- aname->name = mono_string_new (mono_object_domain (assembly), name->name);
+ aname->name = mono_string_new (domain, name->name);
aname->major = name->major;
aname->minor = name->minor;
aname->revision = name->revision;
aname->hashalg = name->hash_alg;
- absolute = g_build_filename (assembly->assembly->basedir, assembly->assembly->image->module_name, NULL);
codebase = g_filename_to_uri (absolute, NULL, NULL);
- aname->codebase = mono_string_new (mono_object_domain (assembly), codebase);
- g_free (codebase);
- g_free (absolute);
+ if (codebase) {
+ aname->codebase = mono_string_new (domain, codebase);
+ g_free (codebase);
+ }
if (!create_culture) {
MonoMethodDesc *desc = mono_method_desc_new ("System.Globalization.CultureInfo:CreateSpecificCulture(string)", TRUE);
mono_method_desc_free (desc);
}
- args [0] = mono_string_new (mono_object_domain (assembly), name->culture);
+ args [0] = mono_string_new (domain, name->culture);
aname->cultureInfo =
mono_runtime_invoke (create_culture, NULL, args, NULL);
pkey_ptr = name->public_key;
pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
- aname->publicKey = mono_array_new (mono_object_domain (assembly), mono_defaults.byte_class, pkey_len);
+ aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
}
}
+static void
+ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, MonoReflectionAssemblyName *aname)
+{
+ gchar *absolute;
+
+ MONO_ARCH_SAVE_REGS;
+
+ absolute = g_build_filename (assembly->assembly->basedir, assembly->assembly->image->module_name, NULL);
+
+ fill_reflection_assembly_name (mono_object_domain (assembly), aname,
+ &assembly->assembly->aname, absolute);
+
+ g_free (absolute);
+}
+
+static void
+ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, MonoReflectionAssemblyName *aname)
+{
+ char *filename;
+ MonoImageOpenStatus status = MONO_IMAGE_OK;
+ gboolean res;
+ MonoImage *image;
+ MonoAssemblyName name;
+
+ MONO_ARCH_SAVE_REGS;
+
+ filename = mono_string_to_utf8 (fname);
+
+ image = mono_image_open (filename, &status);
+
+ if (!image){
+ g_free (filename);
+ MonoException *exc = mono_get_exception_file_not_found (fname);
+ mono_raise_exception (exc);
+ }
+
+ res = mono_assembly_fill_assembly_name (image, &name);
+ if (!res) {
+ mono_image_close (image);
+ g_free (filename);
+ mono_raise_exception (mono_get_exception_argument ("assemblyFile", "The file does not contain a manifest"));
+ }
+
+ fill_reflection_assembly_name (mono_domain_get (), aname, &name, filename);
+
+ g_free (filename);
+ mono_image_close (image);
+}
+
static MonoArray*
mono_module_get_types (MonoDomain *domain, MonoImage *image,
MonoBoolean exportedOnly)
"System.Reflection.Assembly::InternalGetType", ves_icall_System_Reflection_Assembly_InternalGetType,
"System.Reflection.Assembly::GetTypes", ves_icall_System_Reflection_Assembly_GetTypes,
"System.Reflection.Assembly::FillName", ves_icall_System_Reflection_Assembly_FillName,
+ "System.Reflection.Assembly::InternalGetAssemblyName", ves_icall_System_Reflection_Assembly_InternalGetAssemblyName,
"System.Reflection.Assembly::get_code_base", ves_icall_System_Reflection_Assembly_get_code_base,
"System.Reflection.Assembly::get_location", ves_icall_System_Reflection_Assembly_get_location,
"System.Reflection.Assembly::InternalImageRuntimeVersion", ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion,