ConsoleSetOutFix.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using HarmonyLib;
  7. namespace BepInEx.Preloader.Core.RuntimeFixes
  8. {
  9. public static class ConsoleSetOutFix
  10. {
  11. private static AggregatedTextWriter aggregatedTextWriter;
  12. public static void Apply()
  13. {
  14. aggregatedTextWriter = new AggregatedTextWriter(Console.Out);
  15. Console.SetOut(aggregatedTextWriter);
  16. HarmonyLib.Harmony.CreateAndPatchAll(typeof(ConsoleSetOutFix));
  17. }
  18. [HarmonyPatch(typeof(Console), nameof(Console.SetOut))]
  19. [HarmonyPrefix]
  20. private static bool OnSetOut(TextWriter newOut)
  21. {
  22. aggregatedTextWriter.Add(newOut);
  23. return false;
  24. }
  25. }
  26. internal class AggregatedTextWriter : TextWriter
  27. {
  28. public override Encoding Encoding { get; } = Encoding.UTF8;
  29. private List<TextWriter> writers = new List<TextWriter>();
  30. public AggregatedTextWriter(params TextWriter[] initialWriters)
  31. {
  32. writers.AddRange(initialWriters.Where(w => w != null));
  33. }
  34. public void Add(TextWriter tw)
  35. {
  36. if (writers.Any(t => t == tw))
  37. return;
  38. writers.Add(tw);
  39. }
  40. public override void Flush() => writers.ForEach(w => w.Flush());
  41. public override void Write(object value) => writers.ForEach(w => w.Write(value));
  42. public override void Write(string value) => writers.ForEach(w => w.Write(value));
  43. public override void Write(char value) => writers.ForEach(w => w.Write(value));
  44. public override void WriteLine(object value) => writers.ForEach(w => w.WriteLine(value));
  45. public override void WriteLine(string value) => writers.ForEach(w => w.WriteLine(value));
  46. public override void WriteLine(char value) => writers.ForEach(w => w.WriteLine(value));
  47. }
  48. }