SMAPI/ModLoader/MonoMod/Program.cs

104 lines
3.8 KiB
C#

using Mono.Cecil;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using MonoMod.Utils;
using System.Reflection;
namespace MonoMod {
class Program {
#if !MONOMOD_NO_ENTRY
public static int Main(string[] args) {
Console.WriteLine("MonoMod " + typeof(Program).GetTypeInfo().Assembly.GetName().Version);
if (args.Length == 0) {
Console.WriteLine("No valid arguments (assembly path) passed.");
if (System.Diagnostics.Debugger.IsAttached) // Keep window open when running in IDE
Console.ReadKey();
return 0;
}
string pathIn;
string pathOut;
int pathInI = 0;
for (int i = 0; i < args.Length; i++)
if (args[i] == "--dependency-missing-throw=0" || args[i] == "--lean-dependencies") {
Environment.SetEnvironmentVariable("MONOMOD_DEPENDENCY_MISSING_THROW", "0");
pathInI = i + 1;
} else if (args[i] == "--cleanup=0" || args[i] == "--skip-cleanup") {
Environment.SetEnvironmentVariable("MONOMOD_CLEANUP", "0");
pathInI = i + 1;
} else if (args[i] == "--cleanup-all=1" || args[i] == "--cleanup-all") {
Environment.SetEnvironmentVariable("MONOMOD_CLEANUP_ALL", "1");
pathInI = i + 1;
} else if (args[i] == "--verbose=1" || args[i] == "--verbose" || args[i] == "-v") {
Environment.SetEnvironmentVariable("MONOMOD_LOG_VERBOSE", "1");
pathInI = i + 1;
} else if (args[i] == "--cache=0" || args[i] == "--uncached") {
Environment.SetEnvironmentVariable("MONOMOD_RELINKER_CACHED", "0");
pathInI = i + 1;
}
if (pathInI >= args.Length) {
Console.WriteLine("No assembly path passed.");
if (System.Diagnostics.Debugger.IsAttached) // Keep window open when running in IDE
Console.ReadKey();
return 0;
}
pathIn = args[pathInI];
pathOut = args.Length != 1 && pathInI != args.Length - 1 ? args[args.Length - 1] : null;
pathOut = pathOut ?? Path.Combine(Path.GetDirectoryName(pathIn), "MONOMODDED_" + Path.GetFileName(pathIn));
if (File.Exists(pathOut)) File.Delete(pathOut);
#if !DEBUG
try {
#endif
using (MonoModder mm = new MonoModder() {
InputPath = pathIn,
OutputPath = pathOut
}) {
mm.Read();
if (args.Length <= 2) {
mm.Log("[Main] Scanning for mods in directory.");
mm.ReadMod(Directory.GetParent(pathIn).FullName);
} else {
mm.Log("[Main] Reading mods list from arguments.");
for (int i = pathInI + 1; i < args.Length - 1; i++)
mm.ReadMod(args[i]);
}
mm.MapDependencies();
mm.Log("[Main] mm.AutoPatch();");
mm.AutoPatch();
mm.Write();
mm.Log("[Main] Done.");
}
#if !DEBUG
} catch (Exception e) {
Console.WriteLine(e);
if (System.Diagnostics.Debugger.IsAttached) // Keep window open when running in IDE
Console.ReadKey();
return -1;
}
#endif
if (System.Diagnostics.Debugger.IsAttached) // Keep window open when running in IDE
Console.ReadKey();
return 0;
}
#endif
}
}