static public void ComputeDependencies(IEnumerable <string> assemblies, MonoTouchResolver resolver) { // note: Parallel.ForEach (with lock to add on 'digests') turns out (much) slower // (linksdk.app with 20 assemblies) // likely because it's faster (using commoncrypto) than it seems foreach (string a in assemblies) { string key = Path.GetFileNameWithoutExtension(a); using (Stream fs = File.OpenRead(a)) { string digest = ComputeDigest(fs, 140); digests.Add(key, digest); } } Dictionary <string, HashSet <string> > dependencies = new Dictionary <string, HashSet <string> > (); foreach (string a in assemblies) { HashSet <string> references; AssemblyDefinition ad = resolver.Load(a); foreach (AssemblyNameReference ar in ad.MainModule.AssemblyReferences) { if (!dependencies.TryGetValue(ar.Name, out references)) { references = new HashSet <string> (); dependencies.Add(ar.Name, references); } references.Add(ad.Name.Name); } } #if DEBUG foreach (var kvp in dependencies) { Console.WriteLine("The following assemblies depends on {0}", kvp.Key); foreach (var s in kvp.Value) { Console.WriteLine("\t{0}", s); } } #endif // if a dependency has changed everything that depends on it must be cleaned foreach (var kvp in dependencies) { string cname = kvp.Key + ".*.cache." + GetDigestForAssembly(kvp.Key) + ".o"; var files = Directory.GetFiles(Location, cname); if (files.Length != 0) { continue; } Clean(kvp.Key + "*"); foreach (var deps in kvp.Value) { Clean(deps + "*"); } } }
static public void ComputeDependencies (IEnumerable<string> assemblies, MonoTouchResolver resolver) { // note: Parallel.ForEach (with lock to add on 'digests') turns out (much) slower // (linksdk.app with 20 assemblies) // likely because it's faster (using commoncrypto) than it seems foreach (string a in assemblies) { string key = Path.GetFileNameWithoutExtension (a); using (Stream fs = File.OpenRead (a)) { string digest = ComputeDigest (fs, 140); digests.Add (key, digest); } } Dictionary<string, HashSet<string>> dependencies = new Dictionary<string, HashSet<string>> (); foreach (string a in assemblies) { HashSet<string> references; AssemblyDefinition ad = resolver.Load (a); foreach (AssemblyNameReference ar in ad.MainModule.AssemblyReferences) { if (!dependencies.TryGetValue (ar.Name, out references)) { references = new HashSet<string> (); dependencies.Add (ar.Name, references); } references.Add (ad.Name.Name); } } #if DEBUG foreach (var kvp in dependencies) { Console.WriteLine ("The following assemblies depends on {0}", kvp.Key); foreach (var s in kvp.Value) Console.WriteLine ("\t{0}", s); } #endif // if a dependency has changed everything that depends on it must be cleaned foreach (var kvp in dependencies) { string cname = kvp.Key + ".*.cache." + GetDigestForAssembly (kvp.Key) + ".o"; var files = Directory.GetFiles (Location, cname); if (files.Length != 0) continue; Clean (kvp.Key + "*"); foreach (var deps in kvp.Value) Clean (deps + "*"); } }