CodeLoader.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using System;
  2. using System.IO;
  3. using System.Reflection;
  4. using System.Runtime.Loader;
  5. namespace ET
  6. {
  7. public class CodeLoader: Singleton<CodeLoader>, ISingletonAwake
  8. {
  9. private AssemblyLoadContext assemblyLoadContext;
  10. private Assembly assembly;
  11. public void Awake()
  12. {
  13. Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
  14. foreach (Assembly ass in assemblies)
  15. {
  16. if (ass.GetName().Name == "Model")
  17. {
  18. this.assembly = ass;
  19. break;
  20. }
  21. }
  22. Assembly hotfixAssembly = this.LoadHotfix();
  23. World.Instance.AddSingleton<CodeTypes, Assembly[]>([typeof (World).Assembly, typeof(Init).Assembly, this.assembly, hotfixAssembly]);
  24. IStaticMethod start = new StaticMethod(this.assembly, "ET.Entry", "Start");
  25. start.Run();
  26. }
  27. private Assembly LoadHotfix()
  28. {
  29. assemblyLoadContext?.Unload();
  30. GC.Collect();
  31. assemblyLoadContext = new AssemblyLoadContext("Hotfix", true);
  32. byte[] dllBytes = File.ReadAllBytes("./Hotfix.dll");
  33. byte[] pdbBytes = File.ReadAllBytes("./Hotfix.pdb");
  34. Assembly hotfixAssembly = assemblyLoadContext.LoadFromStream(new MemoryStream(dllBytes), new MemoryStream(pdbBytes));
  35. return hotfixAssembly;
  36. }
  37. public void Reload()
  38. {
  39. Assembly hotfixAssembly = this.LoadHotfix();
  40. CodeTypes codeTypes = World.Instance.AddSingleton<CodeTypes, Assembly[]>([typeof (World).Assembly, typeof(Init).Assembly, this.assembly, hotfixAssembly
  41. ]);
  42. codeTypes.CreateCode();
  43. Log.Debug($"reload dll finish!");
  44. }
  45. }
  46. }