Fix bug #519922.
authorAnkit Jain <radical@corewars.org>
Wed, 15 Jul 2009 19:43:02 +0000 (19:43 -0000)
committerAnkit Jain <radical@corewars.org>
Wed, 15 Jul 2009 19:43:02 +0000 (19:43 -0000)
* AssemblyResolver.cs (FindInDirectory): Try the @reference as a
filename as it is, or with different @file_extensions.
If @reference is a assembly name, then look for *.@file_extensions
for target assembly.
(GetAssemblyNameFromFile): Log FileNotFoundException and BadImageFormatException
separately, instead of a single unclear message.

Change all uses of Assembly.GetAssemblyName with GetAssemblyNameFromFile
which does the required error checking and logging.

svn path=/trunk/mcs/; revision=137986

mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/AssemblyResolver.cs
mcs/class/Microsoft.Build.Tasks/Microsoft.Build.Tasks/ChangeLog

index 5c52877d453f9396cb7729ed152ad6f40a5c7f1f..1f3244f862f8a8c86190be64ca5ed76136488785 100644 (file)
@@ -141,25 +141,34 @@ namespace Microsoft.Build.Tasks {
 
                public ResolvedReference FindInDirectory (ITaskItem reference, string directory, string [] file_extensions)
                {
-                       if (reference.ItemSpec.IndexOf (',') > 0) {
-                               // Probably an assembly name
-                               AssemblyName key_aname = new AssemblyName (reference.ItemSpec);
-                               foreach (string extn in file_extensions) {
-                                       foreach (string file in Directory.GetFiles (directory, "*" + extn)) {
-                                               AssemblyName found = AssemblyName.GetAssemblyName (file);
-
-                                               //FIXME: Extract 'name' and look only for name.dll name.exe ?
-                                               if (AssemblyNamesCompatible (key_aname, found, false))
-                                                       return GetResolvedReference (reference, file, true, SearchPath.Directory);
-
-                                               SearchLogger.WriteLine ("Considered {0}, but assembly name wasn't compatible.", file);
-                                       }
-                               }
-                       } else {
+                       if (reference.ItemSpec.IndexOf (',') < 0) {
                                // Try as a filename
                                string path = Path.Combine (directory, reference.ItemSpec);
                                if (GetAssemblyNameFromFile (path) != null)
                                        return GetResolvedReference (reference, path, true, SearchPath.Directory);
+
+                               foreach (string extn in file_extensions) {
+                                       string path_with_extn = path + extn;
+                                       if (GetAssemblyNameFromFile (path_with_extn) != null)
+                                               return GetResolvedReference (reference, path_with_extn, true, SearchPath.Directory);
+                               }
+                       }
+
+                       // Probably an assembly name
+                       AssemblyName key_aname = new AssemblyName (reference.ItemSpec);
+                       foreach (string extn in file_extensions) {
+                               foreach (string file in Directory.GetFiles (directory, "*" + extn)) {
+                                       AssemblyName found_aname = GetAssemblyNameFromFile (file);
+                                       if (found_aname == null)
+                                               // error already logged
+                                               continue;
+
+                                       //FIXME: Extract 'name' and look only for name.dll name.exe ?
+                                       if (AssemblyNamesCompatible (key_aname, found_aname, false))
+                                               return GetResolvedReference (reference, file, true, SearchPath.Directory);
+
+                                       SearchLogger.WriteLine ("Considered {0}, but assembly name wasn't compatible.", file);
+                               }
                        }
 
                        return null;
@@ -169,7 +178,7 @@ namespace Microsoft.Build.Tasks {
                {
                        TargetFrameworkAssemblies gac_asm = new TargetFrameworkAssemblies (directory);
                        foreach (string file in Directory.GetFiles (directory, "*.dll")) {
-                               AssemblyName aname = AssemblyName.GetAssemblyName (file);
+                               AssemblyName aname = GetAssemblyNameFromFile (file);
                                gac_asm.NameToAssemblyNameCache [aname.Name] =
                                        new KeyValuePair<AssemblyName, string> (aname, file);
                        }
@@ -243,18 +252,18 @@ namespace Microsoft.Build.Tasks {
                public AssemblyName GetAssemblyNameFromFile (string filename)
                {
                        AssemblyName aname = null;
+                       filename = Path.GetFullPath (filename);
                        try {
                                aname = AssemblyName.GetAssemblyName (filename);
                        } catch (FileNotFoundException) {
+                               SearchLogger.WriteLine ("Considered '{0}' as a file, but the file does not exist",
+                                               filename);
                        } catch (BadImageFormatException) {
+                               SearchLogger.WriteLine ("Considered '{0}' as a file, but it is an invalid assembly",
+                                               filename);
                        }
 
-                       if (aname != null)
-                               return aname;
-
-                       SearchLogger.WriteLine ("Considered '{0}' as a file, but it is either an invalid assembly " +
-                                       "or file does not exist.", Path.GetFullPath (filename));
-                       return null;
+                       return aname;
                }
 
                static bool AssemblyNamesCompatible (AssemblyName a, AssemblyName b, bool specificVersion)
index f21a4fe1a63b102c7d0239df46561a6eed2b2e39..cee2ab62f0231cbda491ff31bdb6c18e5fd54bf2 100644 (file)
@@ -1,3 +1,17 @@
+2009-07-16  Ankit Jain  <jankit@novell.com>
+
+       Fix bug #519922.
+
+       * AssemblyResolver.cs (FindInDirectory): Try the @reference as a
+       filename as it is, or with different @file_extensions.
+       If @reference is a assembly name, then look for *.@file_extensions
+       for target assembly.
+       (GetAssemblyNameFromFile): Log FileNotFoundException and BadImageFormatException
+       separately, instead of a single unclear message.
+
+       Change all uses of Assembly.GetAssemblyName with GetAssemblyNameFromFile
+       which does the required error checking and logging.
+
 2009-06-12  Ankit Jain  <jankit@novell.com>
 
        * Utilities.cs: New.