}
if (image->assembly) {
- /* Already loaded by another appdomain */
- mono_assembly_invoke_load_hook (image->assembly);
- mono_image_close (image);
- g_free (fname);
- return image->assembly;
+ /* We want to return the MonoAssembly that's already loaded,
+ * but if we're using the strict assembly loader, we also need
+ * to check that the previously loaded assembly matches the
+ * predicate. It could be that we previously loaded a
+ * different version that happens to have the filename that
+ * we're currently probing. */
+ if (mono_loader_get_strict_strong_names () &&
+ predicate && !predicate (image->assembly, user_data)) {
+ mono_image_close (image);
+ g_free (fname);
+ return NULL;
+ } else {
+ /* Already loaded by another appdomain */
+ mono_assembly_invoke_load_hook (image->assembly);
+ mono_image_close (image);
+ g_free (fname);
+ return image->assembly;
+ }
}
ass = mono_assembly_load_from_predicate (image, fname, refonly, predicate, user_data, status);
gboolean
mono_assembly_has_reference_assembly_attribute (MonoAssembly *assembly, MonoError *error)
{
+ g_assert (assembly && assembly->image);
+ /* .NET Framework appears to ignore the attribute on dynamic
+ * assemblies, so don't call this function for dynamic assemblies. */
+ g_assert (!image_is_dynamic (assembly->image));
error_init (error);
/*
ass->ref_only = refonly;
ass->image = image;
- mono_profiler_assembly_event (ass, MONO_PROFILE_START_LOAD);
+ MONO_PROFILER_RAISE (assembly_loading, (ass));
mono_assembly_fill_assembly_name (image, &ass->aname);
mono_assembly_invoke_load_hook (ass);
- mono_profiler_assembly_loaded (ass, MONO_PROFILE_OK);
+ MONO_PROFILER_RAISE (assembly_loaded, (ass));
return ass;
}
{
MonoError refasm_error;
error_init (&refasm_error);
- if (candidate && !refonly && mono_assembly_has_reference_assembly_attribute (candidate, &refasm_error)) {
- candidate = NULL;
+ if (candidate && !refonly) {
+ /* .NET Framework seems to not check for ReferenceAssemblyAttribute on dynamic assemblies */
+ if (!image_is_dynamic (candidate->image) &&
+ mono_assembly_has_reference_assembly_attribute (candidate, &refasm_error))
+ candidate = NULL;
}
mono_error_cleanup (&refasm_error);
return candidate;
if (InterlockedDecrement (&assembly->ref_count) > 0)
return FALSE;
- mono_profiler_assembly_event (assembly, MONO_PROFILE_START_UNLOAD);
+ MONO_PROFILER_RAISE (assembly_unloading, (assembly));
mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Unloading assembly %s [%p].", assembly->aname.name, assembly);
g_slist_free (assembly->friend_assembly_names);
g_free (assembly->basedir);
- mono_profiler_assembly_event (assembly, MONO_PROFILE_END_UNLOAD);
+ MONO_PROFILER_RAISE (assembly_unloaded, (assembly));
return TRUE;
}