*** Reference.cs	Wed Oct 29 19:36:46 2003
--- Reference.cs	Thu Dec 04 18:32:41 2003
***************
*** 21,26 ****
--- 21,27 ----
  
  using System;
  using System.CodeDom.Compiler;
+ using System.Collections;
  using System.Collections.Specialized;
  using System.Globalization;
  using System.IO;
***************
*** 262,268 ****
              }
  
              // get a list of the references in the output directory
!             foreach (string referenceFile in Directory.GetFiles(fi.DirectoryName, "*.dll")) {
                  // now for each reference, get the related files (.xml, .pdf, etc...)
                  string relatedFiles = Path.GetFileName(Path.ChangeExtension(referenceFile, ".*"));
  
--- 263,269 ----
              }
  
              // get a list of the references in the output directory
!             foreach (string referenceFile in GetAllReferencedModules(_referenceFile)) {
                  // now for each reference, get the related files (.xml, .pdf, etc...)
                  string relatedFiles = Path.GetFileName(Path.ChangeExtension(referenceFile, ".*"));
  
***************
*** 308,313 ****
--- 309,351 ----
  
          #region Private Instance Methods
  
+         private string[] GetAllReferencedModules(string module) {
+             string fullPathToModule = Path.GetFullPath(module);
+             string moduleDirectory = Path.GetDirectoryName(fullPathToModule);
+             AppDomain temporaryDomain = AppDomain.CreateDomain("temporaryDomain");
+ 
+             Hashtable allReferences = new Hashtable();
+             Hashtable unresolvedReferences = new Hashtable();
+ 
+             try {
+                 ReferencesResolver referencesResolver =
+                     ((ReferencesResolver) temporaryDomain.CreateInstanceFrom(Assembly.GetExecutingAssembly().Location,
+                         typeof(ReferencesResolver).FullName).Unwrap());
+ 
+                 allReferences.Add(fullPathToModule, null);
+                 unresolvedReferences.Add(fullPathToModule, null);
+ 
+                 while (unresolvedReferences.Count > 0) {
+                     IDictionaryEnumerator unresolvedEnumerator = unresolvedReferences.GetEnumerator();
+                     unresolvedEnumerator.MoveNext();
+ 
+                     string referenceToResolve = (string) unresolvedEnumerator.Key;
+ 
+                     unresolvedReferences.Remove(referenceToResolve);
+ 
+                     referencesResolver.AppendReferencedModulesLocatedInGivenDirectory(moduleDirectory,
+                         referenceToResolve, ref allReferences, ref unresolvedReferences);
+ 
+                 }
+             } finally {
+                 AppDomain.Unload(temporaryDomain);
+             }
+ 
+             string[] result = new string[allReferences.Keys.Count];
+             allReferences.Keys.CopyTo(result, 0);
+             return result;
+         }
+ 
          /// <summary>
          /// Searches for the given file in all paths in <paramref name="folderList" />.
          /// </summary>
***************
*** 412,416 ****
--- 450,474 ----
          private SolutionTask _solutionTask;
  
          #endregion Private Instance Fields
+     }
+ 
+     // Placed here because you cannot instantiate type nested in another type by using AppDomain methods
+     public class ReferencesResolver : MarshalByRefObject {
+         public void AppendReferencedModulesLocatedInGivenDirectory(string moduleDirectory, string moduleName,
+                                                                     ref Hashtable allReferences, ref Hashtable unresolvedReferences) {
+             Assembly module = Assembly.LoadFrom(moduleName);
+             AssemblyName[] referencedAssemblies = module.GetReferencedAssemblies();
+ 
+             foreach (AssemblyName referencedAssemblyName in referencedAssemblies) {
+                 string fullPathToReferencedAssembly = string.Format(@"{0}\{1}.dll", moduleDirectory,
+                                                                     referencedAssemblyName.Name);
+ 
+                 // we only add referenced assemblies which are located in given directory
+                 if (File.Exists(fullPathToReferencedAssembly) && !allReferences.ContainsKey(fullPathToReferencedAssembly)) {
+                     allReferences.Add(fullPathToReferencedAssembly, null);
+                     unresolvedReferences.Add(fullPathToReferencedAssembly, null);
+                 }
+             }
+         }
      }
  }


