Пример #1
0
 protected override void ProcessAssembly(AssemblyDefinition assemblyDef)
 {
     _assemblyResolver.AddSearchDirectory(_frameworkProfile.ReferencesDirectory);
     new SetTargetFrameworkProcessor(_frameworkProfile).Process(assemblyDef);
     new RetargetReferencesProcessor(_frameworkProfile.GetFrameworkAssemblies(), _removeOtherReferences).Process(assemblyDef);
     new RemoveExternalTypesUsageProcessor(_frameworkProfile).Process(assemblyDef);
 }
 public RetargetReferencesProcessor(FrameworkProfile frameworkProfile, bool removeOthers = false)
     : this(frameworkProfile.GetFrameworkAssemblies(), removeOthers)
 {
 }
        protected override void ProcessAssembly(AssemblyDefinition assemblyDef)
        {
            if (_frameworkProfile == null)
            {
                _frameworkProfile = assemblyDef.GuessAssemblyProfile();
            }
            if (_frameworkProfile != null)
            {
                _assemblyResolver.AddSearchDirectory(_frameworkProfile.ReferencesDirectory);
            }
            var typesDependenciesCollector = new CollectTypesDependenciesProcessor(_frameworkProfile);

            typesDependenciesCollector.Process(assemblyDef);

            var goodAssemblyNames = assemblyDef.Modules.SelectMany(asmDef => asmDef.AssemblyReferences);

            if (_removeNonRetargetable)
            {
                goodAssemblyNames = goodAssemblyNames.Where(asmRef => asmRef.IsRetargetable);
            }
            if (_frameworkProfile != null)
            {
                goodAssemblyNames = goodAssemblyNames.Concat(_frameworkProfile.GetFrameworkAssemblies());
            }

            var goodModules = new HashSet <ModuleDefinition>(CecilEqualityComparer.Default);

            goodModules.AddRange(assemblyDef.Modules);
            goodModules.AddRange(goodAssemblyNames.Select(_assemblyResolver.TryResolve).Where(asmDef => asmDef != null).SelectMany(asmDef => asmDef.Modules));

            var allTypesDependencies     = typesDependenciesCollector.AllTypesDependencies;
            var typeDependenciesToRemove = new Queue <TypeReferenceAndDependencies>(allTypesDependencies.Where(
                                                                                        kv => {
                var typeRef = kv.Key;
                var typeDef = typeRef.TryResolve();
                return(typeDef == null || !goodModules.Contains(typeDef.Module));
            }).Select(kv => (TypeReferenceAndDependencies)kv));

            var removedDependencies = new HashSet <TypeDependency>();

            while (typeDependenciesToRemove.Any())
            {
                var typeDependencies = typeDependenciesToRemove.Dequeue();
                var typeRef          = typeDependencies.Type;
                var dependencies     = typeDependencies.DependingMembers;
                Trace.WriteLine(string.Format("Removing dependencies on type {0}:", typeRef), "RemoveExternalTypesUsage");
                Trace.Indent();
                foreach (var dependency in dependencies)
                {
                    if (!removedDependencies.Contains(dependency))
                    {
                        dependency.Break();
                        removedDependencies.Add(dependency);

                        var baseClassDependency = dependency as BaseClassDependency;
                        if (baseClassDependency != null)
                        {
                            var removedClass = baseClassDependency.DerivedClass;
                            if (allTypesDependencies.ContainsKey(removedClass))
                            {
                                var removedClassDependencies = allTypesDependencies[removedClass];
                                typeDependenciesToRemove.Enqueue(new TypeReferenceAndDependencies(removedClass, removedClassDependencies));
                            }
                        }
                    }
                }
                Trace.Unindent();
            }

            base.ProcessAssembly(assemblyDef);
        }