Parcourir la source

Add OutputRedirectType config option to hint about console output redirection

ghorsington il y a 4 ans
Parent
commit
3812358c43

+ 19 - 0
BepInEx/Console/ConsoleManager.cs

@@ -1,4 +1,5 @@
 using System;
+using System.ComponentModel;
 using System.IO;
 using System.Text;
 using BepInEx.Configuration;
@@ -104,5 +105,23 @@ namespace BepInEx
 			"Logging.Console", "ShiftJisEncoding",
 			false,
 			"If true, console is set to the Shift-JIS encoding, otherwise UTF-8 encoding.");
+
+		public static readonly ConfigEntry<ConsoleOutRedirectType> ConfigConsoleOutRedirectType = ConfigFile.CoreConfig.Bind(
+				"Logging.Console", "OutputRedirectType",
+				ConsoleOutRedirectType.Auto,
+				new StringBuilder()
+					.AppendLine("Hints console manager how to redirect console log. Possible values:")
+					.AppendLine("Auto - lets BepInEx decide how to redirect console output")
+					.AppendLine("ConsoleOut - prefer redirecting to console output; if possible, closes standard output")
+					.AppendLine("StandardOut - prefer redirecting to standard output; if possible, closes console out")
+					.ToString()
+			);
+		
+		public enum ConsoleOutRedirectType
+		{
+			[Description("Auto")] Auto = 0,
+			[Description("Console Out")] ConsoleOut,
+			[Description("Standard Out")] StandardOut,
+		}
 	}
 }

+ 4 - 0
BepInEx/Console/Windows/ConsoleWindow.cs

@@ -5,6 +5,7 @@
 
 using System;
 using System.Runtime.InteropServices;
+using BepInEx;
 
 namespace UnityInjector.ConsoleUtil
 {
@@ -39,6 +40,9 @@ namespace UnityInjector.ConsoleUtil
 			if (!SetStdHandle(-11, ConsoleOutHandle))
 				throw new Exception("SetStdHandle() failed");
 
+			if (OriginalStdoutHandle != IntPtr.Zero && ConsoleManager.ConfigConsoleOutRedirectType.Value == ConsoleManager.ConsoleOutRedirectType.ConsoleOut)
+				CloseHandle(OriginalStdoutHandle);
+
 			IsAttached = true;
 		}
 

+ 22 - 1
BepInEx/Console/Windows/WindowsConsoleDriver.cs

@@ -35,7 +35,14 @@ namespace BepInEx
 			
 			// If stdout exists, write to it, otherwise make it the same as console out
 			// Not sure if this is needed? Does the original Console.Out still work?
-			var stdout = ConsoleWindow.OriginalStdoutHandle != IntPtr.Zero ? ConsoleWindow.OriginalStdoutHandle : ConsoleWindow.ConsoleOutHandle;
+			var stdout = GetOutHandle();
+			if (stdout == IntPtr.Zero)
+			{
+				StandardOut = TextWriter.Null;
+				ConsoleOut = TextWriter.Null;
+				return;
+			}
+			
 			var originalOutStream = new FileStream(stdout, FileAccess.Write);
 			StandardOut = new StreamWriter(originalOutStream, new UTF8Encoding(false))
 			{
@@ -52,6 +59,20 @@ namespace BepInEx
 #pragma warning restore 618
 		}
 
+		private IntPtr GetOutHandle()
+		{
+			switch (ConsoleManager.ConfigConsoleOutRedirectType.Value)
+			{
+				case ConsoleManager.ConsoleOutRedirectType.ConsoleOut:
+					return ConsoleWindow.ConsoleOutHandle;
+				case ConsoleManager.ConsoleOutRedirectType.StandardOut:
+					return ConsoleWindow.OriginalStdoutHandle;
+				case ConsoleManager.ConsoleOutRedirectType.Auto:
+				default:
+					return ConsoleWindow.OriginalStdoutHandle != IntPtr.Zero ? ConsoleWindow.OriginalStdoutHandle : ConsoleWindow.ConsoleOutHandle;
+			}
+		}
+
 		public void DetachConsole()
 		{
 			ConsoleWindow.Detach();