Merge pull request #1857 from slluis/fix-assembly-resolver
authorAnkit Jain <radical@gmail.com>
Fri, 5 Jun 2015 14:11:54 +0000 (19:41 +0530)
committerAnkit Jain <radical@gmail.com>
Fri, 5 Jun 2015 14:11:54 +0000 (19:41 +0530)
[MSBuild] Fix assembly resolution issue

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

index bf14075f7ff0dd040cf264e7dca6a96a9c4300fd..5e0ec480956b7199675a256d60af3be29f248df5 100644 (file)
@@ -311,25 +311,44 @@ namespace Microsoft.Build.Tasks {
                                                SearchPath.HintPath, specific_version);
                }
 
-               static Dictionary<string, AssemblyName> assemblyNameCache = new Dictionary<string, AssemblyName> ();
+               class CachedAssemblyName
+               {
+                       public DateTime Time;
+                       public AssemblyName Name;
+               }
+
+               static Dictionary<string, CachedAssemblyName> assemblyNameCache = new Dictionary<string, CachedAssemblyName> ();
                public bool TryGetAssemblyNameFromFile (string filename, out AssemblyName aname)
                {
-                       filename = Path.GetFullPath (filename);
-                       if (assemblyNameCache.TryGetValue (filename, out aname))
+                       FileInfo info = new FileInfo (filename);
+                       if (!info.Exists) {
+                               aname = null;
+                               LogSearchMessage ("Considered '{0}' as a file, but the file does not exist",
+                                                 filename);
+                               return false;
+                       }
+                       filename = info.FullName;
+                       CachedAssemblyName cachedName;
+                       if (assemblyNameCache.TryGetValue (filename, out cachedName) && cachedName.Time == info.LastWriteTime) {
+                               aname = cachedName.Name;
                            return aname != null;
+                       }
 
+                       cachedName = new CachedAssemblyName ();
+                       cachedName.Time = info.LastWriteTime;
                        aname = null;
                        try {
-                               aname = AssemblyName.GetAssemblyName (filename);
+                               cachedName.Name = aname = AssemblyName.GetAssemblyName (filename);
                        } catch (FileNotFoundException) {
                                LogSearchMessage ("Considered '{0}' as a file, but the file does not exist",
                                                filename);
+                               return false;
                        } catch (BadImageFormatException) {
                                LogSearchMessage ("Considered '{0}' as a file, but it is an invalid assembly",
                                                filename);
                        }
 
-                       assemblyNameCache [filename] = aname;
+                       assemblyNameCache [filename] = cachedName;
                        return aname != null;
                }