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);
        }
Beispiel #2
0
        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);
        }