Exemple #1
0
        static void Main(string[] args)
        {
            try
            {
                string filename;

#if DEBUG
                filename = Path.Combine(Directory.GetCurrentDirectory(), Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName));
#else
                filename = Process.GetCurrentProcess().MainModule.FileName;
#endif

                ResolveDirectories.Add(Path.Combine(Path.GetDirectoryName(filename), "BepInEx", "Core"));

                AppDomain.CurrentDomain.AssemblyResolve += RemoteResolve;

                NetPreloaderRunner.OuterMain(args, filename);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unhandled exception");
                Console.WriteLine(ex);
                ReadExit();
            }
        }
Exemple #2
0
        public ValueTask ExecuteAsync(IConsole _)
        {
            _logger.Settings.DebugVerbosity = (int)Verbosity;
            _sw.Start();
            _logger.LogInformation($"UniversalUnityHooks v{Program.Version}");
            _logger.LogDebug($"System Version: {Environment.OSVersion}", 3);
            if (Target == null)
            {
                _logger.LogWarning("Target is null, defaulting to '?_Data/Managed/Assembly-CSharp.dll'.");
                Target = Util.FindAssemblyCSharp(Directory.GetCurrentDirectory());
            }
            _logger.LogDebug($"Input: '{string.Join(",", Files)}'\nTarget: '{Target}'", 3);
            // TODO: More asserts, especially on input files
            CliAssert.IsRequired(Target, "Target Assembly (target,t)");
            CliAssert.IsFile(Target);
            CliAssert.HasExtension(Target, ".dll");
            _logger.LogDebug("Asserts passed, adding resolver...", 2);
            if (AddTargetDirectoryResolve)
            {
                ResolveDirectories.Add(Target.Directory);
            }
            var resolver = Util.CreateAssemblyResolver(ResolveDirectories);

            if (File.Exists(Target.FullName + ".clean"))
            {
                _logger.LogDebug($"IO: '.clean' File exists, overwriting target assembly with clean file...", 4);
                File.Delete(Target.FullName);
                File.Copy(Target.FullName + ".clean", Target.FullName, true);
            }
            _logger.LogDebug($"IO: Reading assembly from '{Target.FullName}'...", 4);
            var targetDefinition = AssemblyDefinition.ReadAssembly(Target.FullName, new ReaderParameters {
                AssemblyResolver = resolver
            });
            var modules = new List <IModule>();

            modules.Add(new HookModule());
            modules.Add(new AddMethodModule());
            modules.Add(new ILProcessorModule());
            modules.Add(new Modules.LowLevelModule());
            _logger.LogDebug($"{modules.Count} Module(s) loaded.", 2);

            Files = Util.FlattenDirectory(Files, "*.dll");

            foreach (var input in Files)
            {
                ReadAndExecute(input, modules, targetDefinition);
            }
            _logger.NewLine();
            if (!DryRun)
            {
                WriteChanges(targetDefinition);
            }

            if (CopyToTarget)
            {
                CopyInputFiles();
            }
            _logger.LogInformation($"Operation completed. Operation took {_sw.ElapsedMilliseconds}ms.");
            return(default);