mono_domain_assembly_search (MonoAssemblyName *aname,
gpointer user_data);
-static MonoAssembly *
-mono_domain_assembly_postload_search (MonoAssemblyName *aname,
- gpointer user_data);
-
static void
mono_domain_fire_assembly_load (MonoAssembly *assembly, gpointer user_data);
mono_install_assembly_refonly_preload_hook (mono_domain_assembly_preload, GUINT_TO_POINTER (TRUE));
mono_install_assembly_search_hook (mono_domain_assembly_search, GUINT_TO_POINTER (FALSE));
mono_install_assembly_refonly_search_hook (mono_domain_assembly_search, GUINT_TO_POINTER (TRUE));
- mono_install_assembly_postload_search_hook (mono_domain_assembly_postload_search, GUINT_TO_POINTER (FALSE));
- mono_install_assembly_postload_refonly_search_hook (mono_domain_assembly_postload_search, GUINT_TO_POINTER (TRUE));
mono_install_assembly_load_hook (mono_domain_fire_assembly_load, NULL);
mono_install_lookup_dynamic_token (mono_reflection_lookup_dynamic_token);
}
MonoReflectionAssembly *
-mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, gboolean refonly)
+mono_try_assembly_resolve (MonoDomain *domain, MonoString *fname, MonoAssembly *requesting, gboolean refonly)
{
MonoClass *klass;
MonoMethod *method;
MonoBoolean isrefonly;
- gpointer params [2];
+ gpointer params [3];
if (mono_runtime_get_no_exec ())
return NULL;
isrefonly = refonly ? 1 : 0;
params [0] = fname;
- params [1] = &isrefonly;
+ params [1] = (requesting) ? mono_assembly_get_object (domain, requesting) : NULL;
+ params [2] = &isrefonly;
return (MonoReflectionAssembly *) mono_runtime_invoke (method, domain->domain, params, NULL);
}
-static MonoAssembly *
-mono_domain_assembly_postload_search (MonoAssemblyName *aname,
- gpointer user_data)
+MonoAssembly *
+mono_domain_assembly_postload_search (MonoAssemblyName *aname, MonoAssembly *requesting,
+ gboolean refonly)
{
- gboolean refonly = GPOINTER_TO_UINT (user_data);
MonoReflectionAssembly *assembly;
MonoDomain *domain = mono_domain_get ();
char *aname_str;
g_free (aname_str);
return NULL;
}
- assembly = mono_try_assembly_resolve (domain, str, refonly);
+ assembly = mono_try_assembly_resolve (domain, str, requesting, refonly);
g_free (aname_str);
if (assembly)
if (!parsed) {
/* This is a parse error... */
if (!refOnly)
- refass = mono_try_assembly_resolve (domain, assRef, refOnly);
+ refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly);
return refass;
}
if (!ass) {
/* MS.NET doesn't seem to call the assembly resolve handler for refonly assemblies */
if (!refOnly)
- refass = mono_try_assembly_resolve (domain, assRef, refOnly);
+ refass = mono_try_assembly_resolve (domain, assRef, NULL, refOnly);
else
refass = NULL;
if (!refass) {
static GSList *loaded_assembly_bindings = NULL;
static MonoAssembly*
-mono_assembly_invoke_search_hook_internal (MonoAssemblyName *aname, gboolean refonly, gboolean postload);
+mono_assembly_invoke_search_hook_internal (MonoAssemblyName *aname, MonoAssembly *requesting, gboolean refonly, gboolean postload);
+static MonoAssembly*
+mono_assembly_load_full_internal (MonoAssemblyName *aname, MonoAssembly *requesting, const char *basedir, MonoImageOpenStatus *status, gboolean refonly);
static MonoBoolean
mono_assembly_is_in_gac (const gchar *filanem);
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);
+ reference = mono_assembly_load_full_internal (&aname, image->assembly, image->assembly->basedir, &status, FALSE);
else {
reference = mono_assembly_loaded_full (&aname, TRUE);
if (!reference)
/* Try a postload search hook */
- reference = mono_assembly_invoke_search_hook_internal (&aname, TRUE, TRUE);
+ reference = mono_assembly_invoke_search_hook_internal (&aname, image->assembly, TRUE, TRUE);
}
/*
* The second load attempt has the basedir set to keep compatibility with the old mono behavior, for
* example bug-349190.2.cs and who knows how much more code in the wild.
*/
- reference = mono_assembly_load (&aname, NULL, &status);
+ reference = mono_assembly_load_full_internal (&aname, image->assembly, NULL, &status, FALSE);
if (!reference && image->assembly)
- reference = mono_assembly_load (&aname, image->assembly->basedir, &status);
+ reference = mono_assembly_load_full_internal (&aname, image->assembly, image->assembly->basedir, &status, FALSE);
}
if (reference == NULL){
AssemblySearchHook *assembly_search_hook = NULL;
static MonoAssembly*
-mono_assembly_invoke_search_hook_internal (MonoAssemblyName *aname, gboolean refonly, gboolean postload)
+mono_assembly_invoke_search_hook_internal (MonoAssemblyName *aname, MonoAssembly *requesting, gboolean refonly, gboolean postload)
{
AssemblySearchHook *hook;
+ if (postload)
+ mono_domain_assembly_postload_search(aname, requesting, refonly);
+
for (hook = assembly_search_hook; hook; hook = hook->next) {
if ((hook->refonly == refonly) && (hook->postload == postload)) {
MonoAssembly *ass = hook->func (aname, hook->user_data);
MonoAssembly*
mono_assembly_invoke_search_hook (MonoAssemblyName *aname)
{
- return mono_assembly_invoke_search_hook_internal (aname, FALSE, FALSE);
+ return mono_assembly_invoke_search_hook_internal (aname, NULL, FALSE, FALSE);
}
static void
* assemblies lock.
*/
if (ass->aname.name) {
- ass2 = mono_assembly_invoke_search_hook_internal (&ass->aname, refonly, FALSE);
+ ass2 = mono_assembly_invoke_search_hook_internal (&ass->aname, NULL, refonly, FALSE);
if (ass2) {
g_free (ass);
g_free (base_dir);
res->in_gac = TRUE;
else {
MonoDomain *domain = mono_domain_get ();
- MonoReflectionAssembly *refasm = mono_try_assembly_resolve (domain, mono_string_new (domain, name), FALSE);
+ MonoReflectionAssembly *refasm = mono_try_assembly_resolve (domain, mono_string_new (domain, name), NULL, FALSE);
if (refasm)
res = refasm->assembly;
}
return result;
}
+MonoAssembly*
+mono_assembly_load_full_internal (MonoAssemblyName *aname, MonoAssembly *requesting, const char *basedir, MonoImageOpenStatus *status, gboolean refonly)
+{
+ MonoAssembly *result = mono_assembly_load_full_nosearch (aname, basedir, status, refonly);
+
+ if (!result)
+ /* Try a postload search hook */
+ result = mono_assembly_invoke_search_hook_internal (aname, requesting, refonly, TRUE);
+ return result;
+}
+
/**
* mono_assembly_load_full:
* @aname: A MonoAssemblyName with the assembly name to load.
MonoAssembly*
mono_assembly_load_full (MonoAssemblyName *aname, const char *basedir, MonoImageOpenStatus *status, gboolean refonly)
{
- MonoAssembly *result = mono_assembly_load_full_nosearch (aname, basedir, status, refonly);
-
- if (!result)
- /* Try a postload search hook */
- result = mono_assembly_invoke_search_hook_internal (aname, refonly, TRUE);
- return result;
+ return mono_assembly_load_full_internal (aname, NULL, basedir, status, refonly);
}
/**
MonoAssembly*
mono_assembly_load (MonoAssemblyName *aname, const char *basedir, MonoImageOpenStatus *status)
{
- return mono_assembly_load_full (aname, basedir, status, FALSE);
+ return mono_assembly_load_full_internal (aname, NULL, basedir, status, FALSE);
}
-
+
MonoAssembly*
mono_assembly_loaded_full (MonoAssemblyName *aname, gboolean refonly)
{
aname = mono_assembly_remap_version (aname, &maped_aname);
- res = mono_assembly_invoke_search_hook_internal (aname, refonly, FALSE);
+ res = mono_assembly_invoke_search_hook_internal (aname, NULL, refonly, FALSE);
return res;
}
--- /dev/null
+using System;
+using System.IO;
+using System.Reflection;
+
+class App
+{
+ public static int Main ()
+ {
+ AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler (MyResolveEventHandler);
+
+ try {
+ var a = Assembly.Load ("test");
+ foreach (Type t in a.GetTypes ()) {
+ Console.WriteLine ("pp: " + t + " " + t.BaseType);
+ }
+ } catch (Exception ex) {
+ Console.WriteLine ("Caught exception: {0}", ex);
+ return 1;
+ }
+
+ return 0;
+ }
+
+ static Assembly MyResolveEventHandler (object sender, ResolveEventArgs args)
+ {
+ var path = Path.Combine (Directory.GetCurrentDirectory (), "assemblyresolve", "deps");
+ if (args.Name == "test" && args.RequestingAssembly == null)
+ return Assembly.LoadFile (Path.Combine (path, "test.dll"));
+ if (args.Name == "TestBase, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" && args.RequestingAssembly.GetName ().Name == "test")
+ return Assembly.LoadFile (Path.Combine (path, "TestBase.dll"));
+
+ throw new InvalidOperationException (String.Format ("Unexpected parameter combination {0} {1}", args.Name, args.RequestingAssembly));
+ }
+}