|
@@ -1,4 +1,5 @@
|
|
|
using System;
|
|
|
+using System.Diagnostics;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
using System.Reflection;
|
|
@@ -48,20 +49,32 @@ namespace BepInEx.Preloader
|
|
|
/// </param>
|
|
|
public static void Main(string[] args)
|
|
|
{
|
|
|
- EnvVars.LoadVars();
|
|
|
+ // We set it to the current directory first as a fallback, but try to use the same location as the .exe file.
|
|
|
+ string silentExceptionLog = $"preloader_{DateTime.Now:yyyyMMdd_HHmmss_fff}.log";
|
|
|
|
|
|
- // Get the path of this DLL via Doorstop env var because Assembly.Location mangles non-ASCII characters on some versions of Mono for unknown reasons
|
|
|
- preloaderPath = Path.GetDirectoryName(Path.GetFullPath(EnvVars.DOORSTOP_INVOKE_DLL_PATH));
|
|
|
+ try
|
|
|
+ {
|
|
|
+ EnvVars.LoadVars();
|
|
|
+
|
|
|
+ silentExceptionLog = Path.Combine(GetCurrentProcessDirectory(), silentExceptionLog);
|
|
|
|
|
|
- AppDomain.CurrentDomain.AssemblyResolve += ResolveCurrentDirectory;
|
|
|
+ // Get the path of this DLL via Doorstop env var because Assembly.Location mangles non-ASCII characters on some versions of Mono for unknown reasons
|
|
|
+ preloaderPath = Path.GetDirectoryName(Path.GetFullPath(EnvVars.DOORSTOP_INVOKE_DLL_PATH));
|
|
|
|
|
|
- // In some versions of Unity 4, Mono tries to resolve BepInEx.dll prematurely because of the call to Paths.SetExecutablePath
|
|
|
- // To prevent that, we have to use reflection and a separate startup class so that we can install required assembly resolvers before the main code
|
|
|
- typeof(Entrypoint).Assembly.GetType($"BepInEx.Preloader.{nameof(PreloaderRunner)}")
|
|
|
- ?.GetMethod(nameof(PreloaderRunner.PreloaderMain))
|
|
|
- ?.Invoke(null, new object[] { args });
|
|
|
+ AppDomain.CurrentDomain.AssemblyResolve += ResolveCurrentDirectory;
|
|
|
|
|
|
- AppDomain.CurrentDomain.AssemblyResolve -= ResolveCurrentDirectory;
|
|
|
+ // In some versions of Unity 4, Mono tries to resolve BepInEx.dll prematurely because of the call to Paths.SetExecutablePath
|
|
|
+ // To prevent that, we have to use reflection and a separate startup class so that we can install required assembly resolvers before the main code
|
|
|
+ typeof(Entrypoint).Assembly.GetType($"BepInEx.Preloader.{nameof(PreloaderRunner)}")
|
|
|
+ ?.GetMethod(nameof(PreloaderRunner.PreloaderMain))
|
|
|
+ ?.Invoke(null, new object[] { args });
|
|
|
+
|
|
|
+ AppDomain.CurrentDomain.AssemblyResolve -= ResolveCurrentDirectory;
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ File.WriteAllText(silentExceptionLog, ex.ToString());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private static Assembly ResolveCurrentDirectory(object sender, ResolveEventArgs args)
|
|
@@ -77,5 +90,10 @@ namespace BepInEx.Preloader
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private static string GetCurrentProcessDirectory()
|
|
|
+ {
|
|
|
+ return Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
|
|
|
+ }
|
|
|
}
|
|
|
}
|