private Assembly DoAssemblyResolve (string name, bool refonly)
{
ResolveEventHandler del;
#if !NET_2_1
if (refonly)
del = ReflectionOnlyAssemblyResolve;
else
del = AssemblyResolve;
#else
del = AssemblyResolve;
#endif
if (del == null)
return null;
/* Prevent infinite recursion */
Hashtable ht;
if (refonly) {
ht = assembly_resolve_in_progress_refonly;
if (ht == null) {
ht = new Hashtable ();
assembly_resolve_in_progress_refonly = ht;
}
} else {
ht = assembly_resolve_in_progress;
if (ht == null) {
ht = new Hashtable ();
assembly_resolve_in_progress = ht;
}
}
string s = (string) ht [name];
if (s != null)
return null;
ht [name] = name;
try {
Delegate[] invocation_list = del.GetInvocationList ();
foreach (Delegate eh in invocation_list) {
ResolveEventHandler handler = (ResolveEventHandler) eh;
Assembly assembly = handler (this, new ResolveEventArgs (name));
if (assembly != null)
return assembly;
}
return null;
}
finally {
ht.Remove (name);
}
}