コード例 #1
0
        /// <summary>
        /// The programs main function.
        /// </summary>
        /// <param name="args">The arguments passed by command line.</param>
        public static void Main(string[] args)
        {
            var arguments = new Arguments();

            arguments.ParseArguments(args);

            if (arguments.ShowHelp)
            {
                Console.WriteLine("Usage: ImpWiz -i InputFile [...] [-o OutputFile ...].");
                Console.WriteLine("");
                Console.WriteLine("Options:");
                Console.WriteLine("\t--help\t\tShows this help.");
                Console.WriteLine("\t-i\t\tThe following assembly files will be rewritten.");
                Console.WriteLine("\t-o\t\tThe following destination files will be used for the input assemblies.");
                return;
            }

            if (arguments.InputFiles.Count == 0)
            {
                Console.Error.WriteLine("Error: No files specified.");
                return;
            }

            if (arguments.InputFiles.Count < arguments.OutputFiles.Count)
            {
                Console.Error.WriteLine("Error: Not enough input files specified, or too much output files specified.");
                return;
            }

            Stopwatch st = new Stopwatch();

            st.Start();

            for (int i = 0; i < arguments.InputFiles.Count; i++)
            {
                var inputFile  = arguments.InputFiles[i];
                var outputFile = arguments.OutputFiles[i];
                if (!File.Exists(inputFile))
                {
                    Console.Error.WriteLine("Input file: " + inputFile + " doesn't exist.");
                    return;
                }

                //try
                //{
                bool overwriteOriginal = Path.GetFullPath(inputFile) == Path.GetFullPath(outputFile);
                //AssemblyDefinition outputAssembly = AssemblyDefinition.ReadAssembly(outputFile);

                AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(inputFile,
                                                                         new ReaderParameters(ReadingMode.Deferred)
                {
                    ReadWrite = overwriteOriginal
                });
                LoadedAssemblies.Add(asm, inputFile);

                ITypeFilterStrategy strategy = TypeFilterStrategy.Exclude;

                bool integrateImpWiz = true;


                var assemblyProcessor = new AssemblyProcessor(asm, strategy, integrateImpWiz);

                assemblyProcessor.Process();

                LoadContext.Unload();


                if (overwriteOriginal)
                {
                    asm.Write();
                }
                else
                {
                    if (File.Exists(outputFile))
                    {
                        File.Delete(outputFile);
                    }
                    asm.Write(outputFile);
                }

                var nAsm    = AssemblyDefinition.ReadAssembly(outputFile);
                var attrTok = nAsm.MainModule.LookupToken(0x04000008);
                var tok     = nAsm.MainModule.LookupToken(0x06000021);

                //}
                //catch (Exception e)
                //{
                //    Console.Error.WriteLine(e);
                //    throw;
                //}
            }

            st.Stop();

            Console.WriteLine(st.ElapsedMilliseconds);
        }
コード例 #2
0
ファイル: AssemblyProcessor.cs プロジェクト: jvbsl/ImpWiz
        public AssemblyProcessor(AssemblyDefinition assembly, ITypeFilterStrategy typeFilterStrategy = null, bool integrateImpWizImporter = false)
        {
            Assembly = assembly;
            IntegrateImpWizImporter = integrateImpWizImporter;
            TypeFilterStrategy      = typeFilterStrategy ?? Filters.TypeFilterStrategy.All;
            NeededModuleReferences  = new HashSet <string>();
            SupportedMarshalers     = new Dictionary <UnmanagedType, HashSet <MarshalerType> >();

            var asmPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

            var originalLibLoaderAssembly = AssemblyDefinition.ReadAssembly(Path.Combine(asmPath, "ImpWiz.Import.dll"));



            if (IntegrateImpWizImporter)
            {
                //var libLoader = new TypeDefinition("ImpWiz.Import", "LibLoader", TypeAttributes.Class | TypeAttributes.Public, Assembly.MainModule.TypeSystem.Object);



                var originalLibLoaderType = originalLibLoaderAssembly.MainModule.Types.First(x => x.Namespace == nameof(ImpWiz) + "." + nameof(Import) + "." + nameof(Import.LibLoader) && x.Name == "LibLoader");

                var libLoader = originalLibLoaderType.Clone(Assembly.MainModule);

                foreach (var importLibType in originalLibLoaderAssembly.MainModule.Types)
                {
                    importLibType.Clone(Assembly.MainModule);
                }



                foreach (var modRef in originalLibLoaderAssembly.MainModule.ModuleReferences)
                {
                    NeededModuleReferences.Add(modRef.Name);
                }


                ImportAssembly = Assembly;

                ImportAssemblyLibLoader = (TypeDefinition)libLoader;
            }
            else
            {
                ImportAssembly = originalLibLoaderAssembly;

                ImportAssemblyLibLoader =
                    ImportAssembly.MainModule.Types.First(x => x.Namespace == nameof(ImpWiz) + "." + nameof(Import) + "." + nameof(Import.LibLoader) && x.Name == "LibLoader");
            }

            var allTypes = IntegrateImpWizImporter ? assembly.MainModule.Types : originalLibLoaderAssembly.MainModule.Types.Concat(assembly.MainModule.Types);

            foreach (var type in allTypes)
            {
                if (type.IsAbstract || type.IsInterface || !type.IsClass)
                {
                    continue;
                }

                if (IsMarshaler(type))
                {
                    var marshaler = new MarshalerType(type);
                    foreach (var unmanagedType in marshaler.SupportedUnmanagedTypes)
                    {
                        HashSet <MarshalerType> marshalers;
                        if (!SupportedMarshalers.TryGetValue(unmanagedType, out marshalers))
                        {
                            marshalers = new HashSet <MarshalerType>();
                            SupportedMarshalers.Add(unmanagedType, marshalers);
                        }

                        marshalers.Add(marshaler);
                    }
                }
            }
        }
コード例 #3
0
 static TypeFilterStrategy()
 {
     All     = new FilterStrategyAll();
     Exclude = new FilterStrategyExclude();
     Include = new FilterStrategyInclude();
 }
コード例 #4
0
 public InterfaceExpendTypesProvider(
     ITypeFilterStrategy typeFilterStrategy
     )
 {
     _typeFilterStrategy = typeFilterStrategy;
 }