add: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Experimental/Loader/AssemblyResolveEvent
add: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Experimental/Loader/AssemblyResolveEvent/a1.cs
File: a1.cs
===================================================================
--- [no source file]
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Experimental/Loader/AssemblyResolveEvent/a1.cs;AsemblyResolve
@@ -1,0 +1,15 @@
+public class C { 
+  D d;
+  
+  public C() {
+    d = new D();
+  } 
+}
+
+public class E {
+  F f;
+
+  public E() {
+    f = new F();
+  }
+}
\ No newline at end of file
===================================================================
add: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Experimental/Loader/AssemblyResolveEvent/a2.cs
File: a2.cs
===================================================================
--- [no source file]
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Experimental/Loader/AssemblyResolveEvent/a2.cs;AsemblyResolve
@@ -1,0 +1,4 @@
+public class D { 
+  public D() {
+  }
+}
\ No newline at end of file
===================================================================
add: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Experimental/Loader/AssemblyResolveEvent/a3.cs
File: a3.cs
===================================================================
--- [no source file]
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Experimental/Loader/AssemblyResolveEvent/a3.cs;AsemblyResolve
@@ -1,0 +1,3 @@
+public class F {
+
+}
\ No newline at end of file
===================================================================
add: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Experimental/Loader/AssemblyResolveEvent/build.bat
File: build.bat
===================================================================
--- [no source file]
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Experimental/Loader/AssemblyResolveEvent/build.bat;AsemblyResolve
@@ -1,0 +1,3 @@
+csc /target:library a3.cs
+csc /target:library a2.cs
+csc /target:library /r:a2.dll /r:a3.dll a1.cs
===================================================================
add: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Experimental/Loader/AssemblyResolveEvent/test_fail.rb
File: test_fail.rb
===================================================================
--- [no source file]
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Experimental/Loader/AssemblyResolveEvent/test_fail.rb;AsemblyResolve
@@ -1,0 +1,15 @@
+class L
+  def to_str
+    puts 'to_str'
+    p C.new if $x == 1  # recursively triggers assembly resolve event looking for "a2.dll"
+    "."
+  end
+end
+
+$: << L.new
+
+$x = 0
+require 'a1.dll'    # directly loads the assembly
+
+$x = 1
+p C.new             # triggers assembly resolve event looking for "a2.dll"
===================================================================
add: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Experimental/Loader/AssemblyResolveEvent/test_ok.rb
File: test_ok.rb
===================================================================
--- [no source file]
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Experimental/Loader/AssemblyResolveEvent/test_ok.rb;AsemblyResolve
@@ -1,0 +1,18 @@
+class L
+  def to_str
+    puts 'to_str'
+    if $x == 1
+      $x = 2
+      p E.new      # triggers assembly resolve event looking for "a3.dll"
+    end
+    "."
+  end
+end
+
+$: << L.new
+
+$x = 0
+require 'a1.dll'    # directly loads the assembly
+
+$x = 1
+p C.new             # triggers assembly resolve event looking for "a2.dll"
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Loader.cs;C1100015
File: Loader.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Loader.cs;C1100015  (server)    9/22/2009 5:33 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Runtime/Loader.cs;AsemblyResolve
@@ -399,6 +399,9 @@
         private sealed class AssemblyResolveHolder {
             private readonly WeakReference _loader;
 
+            [ThreadStatic]
+            private static HashSet<string> _assembliesBeingResolved;
+
             public AssemblyResolveHolder(Loader/*!*/ loader) {
                 _loader = new WeakReference(loader);
             }
@@ -414,7 +417,28 @@
             private Assembly AssemblyResolveEvent(object sender, ResolveEventArgs args) {
                 Loader loader = (Loader)_loader.Target;
                 if (loader != null) {
-                    return loader.ResolveAssembly(args.Name);
+                    string assemblyName = args.Name;
+                    Utils.Log(String.Format("assembly resolve event: {0}", assemblyName), "RESOLVE_ASSEMBLY");
+
+                    if (_assembliesBeingResolved == null) {
+                        _assembliesBeingResolved = new HashSet<string>();
+                    } else if (_assembliesBeingResolved.Contains(assemblyName)) {
+                        Utils.Log(String.Format("recursive assembly resolution: {0}", assemblyName), "RESOLVE_ASSEMBLY");
+                        return null;
+                    }
+
+                    _assembliesBeingResolved.Add(assemblyName);
+                    try {
+                        return loader.ResolveAssembly(assemblyName);
+                    } catch (Exception e) {
+                        // the exception might not be reported by the type loader, so at least report a warning:
+                        loader._context.ReportWarning(
+                            String.Format("An exception was risen while resolving an assembly `{0}': {1}", assemblyName, e.Message)
+                        );
+                        throw;
+                    } finally {
+                        _assembliesBeingResolved.Remove(assemblyName);
+                    }
                 } else {
                     AppDomain.CurrentDomain.AssemblyResolve -= AssemblyResolveEvent;
                     return null;
===================================================================
