瀏覽代碼

Change WriteStringToUnityLog to delegate to address differences between Unity versions

ghorsington 6 年之前
父節點
當前提交
72c91e1592
共有 2 個文件被更改,包括 34 次插入27 次删除
  1. 4 4
      BepInEx/Bootstrap/Preloader.cs
  2. 30 23
      BepInEx/Logging/UnityLogWriter.cs

+ 4 - 4
BepInEx/Bootstrap/Preloader.cs

@@ -13,10 +13,10 @@ using MethodAttributes = Mono.Cecil.MethodAttributes;
 
 namespace BepInEx.Bootstrap
 {
-	/// <summary>
-	///     The main entrypoint of BepInEx, and initializes all patchers and the chainloader.
-	/// </summary>
-	internal static class Preloader
+    /// <summary>
+    ///     The main entrypoint of BepInEx, and initializes all patchers and the chainloader.
+    /// </summary>
+    internal static class Preloader
 	{
 		/// <summary>
 		///     The list of finalizers that were loaded from the patcher contract.

+ 30 - 23
BepInEx/Logging/UnityLogWriter.cs

@@ -11,17 +11,38 @@ namespace BepInEx.Logging
 	/// </summary>
     public class UnityLogWriter : BaseLogger
     {
-		/// <summary>
-		/// Writes a string specifically to the game output log.
-		/// </summary>
-		/// <param name="value">The value to write.</param>
+        private delegate void WriteStringToUnityLogDelegate(string s);
+
+        private static readonly WriteStringToUnityLogDelegate WriteStringToUnityLog;
+
+        static UnityLogWriter()
+        {
+            Type logWriter = typeof(UnityEngine.Logger).Assembly.GetType("UnityEngine.UnityLogWriter");
+
+            MethodInfo writeLog = logWriter.GetMethod("WriteStringToUnityLog",
+                BindingFlags.Static
+                | BindingFlags.Public
+                | BindingFlags.NonPublic);
+            if (writeLog == null)
+            {
+                writeLog = logWriter.GetMethod("WriteStringToUnityLogImpl",
+                    BindingFlags.Static
+                    | BindingFlags.Public
+                    | BindingFlags.NonPublic);
+                if (writeLog == null)
+                    return;
+            }
+
+            WriteStringToUnityLog = (WriteStringToUnityLogDelegate)Delegate.CreateDelegate(typeof(WriteStringToUnityLogDelegate), writeLog);
+        }
+
+        /// <summary>
+        /// Writes a string specifically to the game output log.
+        /// </summary>
+        /// <param name="value">The value to write.</param>
         public void WriteToLog(string value)
         {
-#if UNITY_2018
-            UnityEngine.UnityLogWriter.WriteStringToUnityLogImpl(value);
-#else
-            UnityEngine.UnityLogWriter.WriteStringToUnityLog(value);
-#endif
+            WriteStringToUnityLog?.Invoke(value);
         }
 
         protected void InternalWrite(string value)
@@ -93,17 +114,3 @@ namespace BepInEx.Logging
         }
     }
 }
-
-namespace UnityEngine
-{
-    internal sealed class UnityLogWriter
-    {
-#if UNITY_2018
-        [MethodImpl(MethodImplOptions.InternalCall)]
-        public static extern void WriteStringToUnityLogImpl(string s);
-#endif
-
-        [MethodImpl(MethodImplOptions.InternalCall)]
-        public static extern void WriteStringToUnityLog(string s);
-    }
-}