public IEnumerable<Change<MethodReference>> GetChangesBetween(AssemblyDefinition oldAssembly, AssemblyDefinition newAssembly) { var changeDetector = new MethodILChangeDetector(); var oldCache = AssemblyTypeMethodMapBuilder.BuildFor(oldAssembly); var newCache = AssemblyTypeMethodMapBuilder.BuildFor(newAssembly); var differences = MapKeyDifferenceFinder.GetChangesBetween(oldCache, newCache); foreach (var method in newAssembly.AllNonIgnoredMethods()) { var current = oldAssembly.MainModule.GetType(method.DeclaringType.FullName); if (current == null) continue; if (method.ContainsIgnoreAttribute()) continue; foreach (var oldMethod in current.Methods) { if (oldMethod.GetChangeCacheName() == method.GetChangeCacheName()) { if (changeDetector.AreDifferentIL(oldMethod, method)) { differences.Add( new Change<MethodReference>( ChangeType.Modify, method.ThreadSafeResolve())); break; } } } } differences = IEnumerableResolver.ResolveCompilerGeneratedCode(differences); return differences; }
public static Dictionary<string, MethodReference> BuildFor(AssemblyDefinition assemblyDefinition) { var ret = new Dictionary<string, MethodReference>(); foreach (var m in assemblyDefinition.AllNonIgnoredMethods()) { ret.Add(m.GetChangeCacheName(), m); } return ret; }