Browse Source

Merge pull request #61 from BepInEx/feature-unity-2018

Feature - Unity 2018
Bepis 6 years ago
parent
commit
174c74f0f7

+ 21 - 32
BepInEx.sln

@@ -14,40 +14,29 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BepInEx.Bootstrap", "BepInE
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|v2017 = Debug|v2017
-		Debug|v4 = Debug|v4
-		Debug|v5 = Debug|v5
-		Release|v2017 = Release|v2017
-		Release|v4 = Release|v4
-		Release|v5 = Release|v5
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+		v2018|Any CPU = v2018|Any CPU
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Debug|v2017.ActiveCfg = Debug|Any CPU
-		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Debug|v2017.Build.0 = Debug|Any CPU
-		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Debug|v4.ActiveCfg = Debug|Any CPU
-		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Debug|v4.Build.0 = Debug|Any CPU
-		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Debug|v5.ActiveCfg = Debug|Any CPU
-		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Debug|v5.Build.0 = Debug|Any CPU
-		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Release|v2017.ActiveCfg = Release|Any CPU
-		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Release|v2017.Build.0 = Release|Any CPU
-		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Release|v4.ActiveCfg = Release|Any CPU
-		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Release|v4.Build.0 = Release|Any CPU
-		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Release|v5.ActiveCfg = Release|Any CPU
-		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Release|v5.Build.0 = Release|Any CPU
-		{DC89F18B-235B-4C01-AB31-AF40DCE5C4C7}.Debug|v2017.ActiveCfg = Debug|Any CPU
-		{DC89F18B-235B-4C01-AB31-AF40DCE5C4C7}.Debug|v4.ActiveCfg = Debug|Any CPU
-		{DC89F18B-235B-4C01-AB31-AF40DCE5C4C7}.Debug|v5.ActiveCfg = Debug|Any CPU
-		{DC89F18B-235B-4C01-AB31-AF40DCE5C4C7}.Release|v2017.ActiveCfg = Release|Any CPU
-		{DC89F18B-235B-4C01-AB31-AF40DCE5C4C7}.Release|v4.ActiveCfg = Release|Any CPU
-		{DC89F18B-235B-4C01-AB31-AF40DCE5C4C7}.Release|v5.ActiveCfg = Release|Any CPU
-		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.Debug|v2017.ActiveCfg = Release|Any CPU
-		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.Debug|v4.ActiveCfg = Release|Any CPU
-		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.Debug|v4.Build.0 = Release|Any CPU
-		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.Debug|v5.ActiveCfg = Release|Any CPU
-		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.Debug|v5.Build.0 = Release|Any CPU
-		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.Release|v2017.ActiveCfg = Release|Any CPU
-		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.Release|v4.ActiveCfg = Release|Any CPU
-		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.Release|v5.ActiveCfg = Release|Any CPU
+		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.v2018|Any CPU.ActiveCfg = v2018|Any CPU
+		{4FFBA620-F5ED-47F9-B90C-DAD1316FD9B9}.v2018|Any CPU.Build.0 = v2018|Any CPU
+		{DC89F18B-235B-4C01-AB31-AF40DCE5C4C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DC89F18B-235B-4C01-AB31-AF40DCE5C4C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DC89F18B-235B-4C01-AB31-AF40DCE5C4C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DC89F18B-235B-4C01-AB31-AF40DCE5C4C7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DC89F18B-235B-4C01-AB31-AF40DCE5C4C7}.v2018|Any CPU.ActiveCfg = Release|Any CPU
+		{DC89F18B-235B-4C01-AB31-AF40DCE5C4C7}.v2018|Any CPU.Build.0 = Release|Any CPU
+		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.Debug|Any CPU.ActiveCfg = Release|Any CPU
+		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.Debug|Any CPU.Build.0 = Release|Any CPU
+		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.v2018|Any CPU.ActiveCfg = Release|Any CPU
+		{6E6BC1E5-5BE8-4566-B3AE-52C4CB218AEB}.v2018|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 9 - 0
BepInEx/BepInEx.csproj

@@ -36,6 +36,14 @@
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
     <DebugSymbols>false</DebugSymbols>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'v2018|AnyCPU'">
+    <OutputPath>..\bin\</OutputPath>
+    <DefineConstants>TRACE;UNITY_2018</DefineConstants>
+    <Optimize>true</Optimize>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
   <ItemGroup>
     <Reference Include="0Harmony">
       <HintPath>..\lib\0Harmony.dll</HintPath>
@@ -51,6 +59,7 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Bootstrap\Entrypoint.cs" />
+    <Compile Include="Bootstrap\UnityPatches.cs" />
     <Compile Include="Contract\Attributes.cs" />
     <Compile Include="Bootstrap\AssemblyPatcher.cs" />
     <Compile Include="Bootstrap\Preloader.cs" />

+ 19 - 17
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.
@@ -42,23 +42,25 @@ namespace BepInEx.Bootstrap
 
 		public static void Run()
 		{
-			try
-			{
-				AllocateConsole();
+		    try
+		    {
+		        AllocateConsole();
+
+		        UnityPatches.Apply();
 
-				PreloaderLog =
-					new PreloaderLogWriter(Utility.SafeParseBool(Config.GetEntry("preloader-logconsole", "false", "BepInEx")));
-				PreloaderLog.Enabled = true;
+		        PreloaderLog = 
+		                new PreloaderLogWriter(Utility.SafeParseBool(Config.GetEntry("preloader-logconsole", "false", "BepInEx")));
+		        PreloaderLog.Enabled = true;
 
-				string consoleTile =
-					$"BepInEx {Assembly.GetExecutingAssembly().GetName().Version} - {Process.GetCurrentProcess().ProcessName}";
-				ConsoleWindow.Title = consoleTile;
+		        string consoleTile =
+		                $"BepInEx {Assembly.GetExecutingAssembly().GetName().Version} - {Process.GetCurrentProcess().ProcessName}";
+		        ConsoleWindow.Title = consoleTile;
 
-				Logger.SetLogger(PreloaderLog);
+		        Logger.SetLogger(PreloaderLog);
 
-				PreloaderLog.WriteLine(consoleTile);
+		        PreloaderLog.WriteLine(consoleTile);
 
-				#if DEBUG
+#if DEBUG
 
 				object[] attributes = typeof(DebugInfoAttribute).Assembly.GetCustomAttributes(typeof(DebugInfoAttribute), false);
 				
@@ -69,7 +71,7 @@ namespace BepInEx.Bootstrap
 					PreloaderLog.WriteLine(attribute.Info);
 				}
 
-				#endif
+#endif
 
 				Logger.Log(LogLevel.Message, "Preloader started");
 

+ 28 - 0
BepInEx/Bootstrap/UnityPatches.cs

@@ -0,0 +1,28 @@
+using System;
+using Harmony;
+
+namespace BepInEx.Bootstrap
+{
+    internal static class UnityPatches
+    {
+        public static void Apply()
+        {
+            HarmonyInstance.Create("com.bepinex.unitypatches").PatchAll(typeof(UnityPatches));
+        }
+
+#if UNITY_2018
+        /*
+         * DESC: Workaround for Trace class not working because of missing .config file
+         * AFFECTS: Unity 2018+
+         */
+        [HarmonyPatch(typeof(AppDomain))]
+        [HarmonyPatch(nameof(AppDomain.SetupInformation), PropertyMethod.Getter)]
+        [HarmonyPostfix]
+        public static void GetExeConfigName(AppDomainSetup __result)
+        {
+            __result.ApplicationBase = $"file://{Paths.GameRootPath}";
+            __result.ConfigurationFile = "app.config";
+        }
+#endif
+    }
+}

+ 30 - 14
BepInEx/Logging/UnityLogWriter.cs

@@ -11,13 +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)
         {
-            UnityEngine.UnityLogWriter.WriteStringToUnityLog(value);
+            WriteStringToUnityLog?.Invoke(value);
         }
 
         protected void InternalWrite(string value)
@@ -93,12 +118,3 @@ namespace BepInEx.Logging
         }
     }
 }
-
-namespace UnityEngine
-{
-    internal sealed class UnityLogWriter
-    {
-        [MethodImpl(MethodImplOptions.InternalCall)]
-        public static extern void WriteStringToUnityLog(string s);
-    }
-}