Program.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using BepInEx.Patcher.Internal;
  2. using Mono.Cecil;
  3. using Mono.Cecil.Cil;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace BepInEx.Patcher
  10. {
  11. class Program
  12. {
  13. const string originalDLL = @"M:\koikatu\KoikatuTrial_Data\Managed\Assembly-CSharp-original.dll";
  14. const string outputDLL = @"M:\koikatu\KoikatuTrial_Data\Managed\Assembly-CSharp.dll";
  15. const string unityOriginalDLL = @"M:\koikatu\KoikatuTrial_Data\Managed\UnityEngine-original.dll";
  16. const string unityOutputDLL = @"M:\koikatu\KoikatuTrial_Data\Managed\UnityEngine.dll";
  17. const string injectedDLL = @"M:\koikatu\KoikatuTrial_Data\Managed\BepInEx.dll";
  18. const string referenceDir = @"M:\koikatu\KoikatuTrial_Data\Managed\";
  19. static void Main(string[] args)
  20. {
  21. var defaultResolver = new DefaultAssemblyResolver();
  22. defaultResolver.AddSearchDirectory(referenceDir);
  23. AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(originalDLL, new ReaderParameters {
  24. AssemblyResolver = defaultResolver
  25. });
  26. AssemblyDefinition unity = AssemblyDefinition.ReadAssembly(unityOriginalDLL, new ReaderParameters
  27. {
  28. AssemblyResolver = defaultResolver
  29. });
  30. AssemblyDefinition injected = AssemblyDefinition.ReadAssembly(injectedDLL, new ReaderParameters
  31. {
  32. AssemblyResolver = defaultResolver
  33. });
  34. IPatchPlugin exitScene = new ExitScenePlugin();
  35. exitScene.Patch(assembly);
  36. IPatchPlugin slider = new SliderPlugin();
  37. slider.Patch(assembly);
  38. InjectAssembly(unity, injected);
  39. assembly.Write(outputDLL);
  40. unity.Write(unityOutputDLL);
  41. }
  42. static void InjectAssembly(AssemblyDefinition unity, AssemblyDefinition injected)
  43. {
  44. //unity.MainModule.AssemblyReferences.Add(new AssemblyNameReference(injected.Name, injected.MainModule.v);
  45. var originalInjectMethod = injected.MainModule.Types.First(x => x.Name == "Target").Methods.First(x => x.Name == "Initialize");
  46. var injectMethod = unity.MainModule.Import(originalInjectMethod);
  47. var sceneManager = unity.MainModule.Types.First(x => x.Name == "SceneManager");
  48. foreach (var loadScene in sceneManager.Methods.Where(x => x.Name == "LoadScene"))
  49. {
  50. var IL = loadScene.Body.GetILProcessor();
  51. IL.InsertBefore(loadScene.Body.Instructions[0], IL.Create(OpCodes.Call, injectMethod));
  52. }
  53. }
  54. }
  55. }