Decompiled source of CessilCellsCeaChells v0.3.6

BepInEx/patchers/CessilCellsCeaChells/CessilCellsCeaChells.dll

Decompiled 4 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using CessilCellsCeaChells.CeaChore;
using CessilCellsCeaChells.Internal;
using CessilCellsCeaChells.Merges;
using Microsoft.CodeAnalysis;
using Mono.Cecil;
using Mono.Cecil.Cil;
using Mono.Cecil.Rocks;
using Mono.Collections.Generic;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyCompany("www_Day_Dream")]
[assembly: AssemblyConfiguration("Mono10")]
[assembly: AssemblyFileVersion("0.3.6.0")]
[assembly: AssemblyInformationalVersion("0.3.6+7d89ac2f0f27f18bdede1a7a48d74cf17c6333f1")]
[assembly: AssemblyProduct("CessilCellsCeaChells")]
[assembly: AssemblyTitle("CessilCellsCeaChells")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.3.6.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace CessilCellsCeaChells
{
	public class CessilMerger : IDisposable
	{
		public readonly List<AssemblyDefinition> AssembliesToDispose = new List<AssemblyDefinition>();

		public IAssemblyResolver? TypeResolver { get; set; }

		public string CachePath { get; set; } = Path.GetDirectoryName(typeof(CessilMerger).Assembly.Location) ?? "";


		public IEnumerable<string> TargetDLLFileNames => Merges.Select((CessilMerge merge) => merge.TargetAssemblyName).Distinct();

		private List<CessilMerge> Merges { get; } = new List<CessilMerge>();


		public static event Action<object>? LogDebug;

		public static event Action<object>? LogWarn;

		public static void LogDebugSafe(object o)
		{
			CessilMerger.LogDebug?.Invoke(o);
		}

		public static void LogWarnSafe(object o)
		{
			CessilMerger.LogWarn?.Invoke(o);
		}

		public bool LoadMergesFrom(string dllPath, out int count)
		{
			count = 0;
			if (!AssemblyCacheHandler.TryLoadCachedMerges(dllPath, this, out CessilMerge[] merges))
			{
				return false;
			}
			Merges.AddRange(merges);
			count = merges.Length;
			return true;
		}

		public void MergeInto(AssemblyDefinition assembly)
		{
			AssemblyDefinition assembly2 = assembly;
			foreach (CessilMerge item in Merges.Where((CessilMerge merge) => merge.TargetAssemblyName == ((AssemblyNameReference)assembly2.Name).Name + ".dll"))
			{
				TypeDefinition type = assembly2.MainModule.GetType(((MemberReference)item.TargetTypeRef).FullName);
				IMemberDefinition memberDefinition;
				if (type == null)
				{
					LogWarnSafe("Disregarding merge as it's target type doesn't exist!");
				}
				else if (item.TryMergeInto(type, out memberDefinition))
				{
					LogDebugSafe("Successfully merged '" + ((memberDefinition != null) ? memberDefinition.FullName : null) + "' into '" + ((MemberReference)type).FullName + "'");
				}
			}
		}

		public void Dispose()
		{
			LogDebugSafe("Disposing of loaded AssemblyDefinitions..");
			foreach (AssemblyDefinition item in AssembliesToDispose)
			{
				item.Dispose();
			}
		}
	}
}
namespace CessilCellsCeaChells.Merges
{
	internal abstract class CessilMerge
	{
		internal readonly TypeReference TargetTypeRef;

		private static readonly Dictionary<string, Type> CessilMergeTypes = new Dictionary<string, Type>
		{
			{
				typeof(RequiresFieldAttribute).FullName,
				typeof(FieldMerge)
			},
			{
				typeof(RequiresPropertyAttribute).FullName,
				typeof(PropertyMerge)
			},
			{
				typeof(RequiresMethodAttribute).FullName,
				typeof(MethodMerge)
			},
			{
				typeof(RequiresMethodDefaultsAttribute).FullName,
				typeof(MethodMerge)
			},
			{
				typeof(RequiresEnumInsertionAttribute).FullName,
				typeof(EnumInsertionMerge)
			}
		};

		internal string TargetAssemblyName => ((AssemblyNameReference)((MemberReference)TargetTypeRef.Resolve()).Module.Assembly.Name).Name + ".dll";

		protected CessilMerge(TypeReference targetTypeRef)
		{
			TargetTypeRef = targetTypeRef;
			base..ctor();
		}

		internal static bool TryCreateMerges(AssemblyDefinition assembly, out CessilMerge[] merges)
		{
			merges = (from customAttribute in (IEnumerable<CustomAttribute>)assembly.CustomAttributes
				select new KeyValuePair<bool, CessilMerge>(TryConvertFrom(customAttribute, out CessilMerge merge), merge) into tuple
				where tuple.Key
				select tuple.Value).ToArray();
			return merges.Length != 0;
		}

		private static bool TryConvertFrom(CustomAttribute attribute, out CessilMerge? merge)
		{
			merge = null;
			if (!CessilMergeTypes.TryGetValue(((MemberReference)attribute.AttributeType).FullName, out Type value))
			{
				return false;
			}
			merge = (CessilMerge)Activator.CreateInstance(value, attribute);
			return merge != null;
		}

		internal static TypeReference GetOrImportTypeReference(ModuleDefinition into, Type type)
		{
			TypeReference result = default(TypeReference);
			if (!into.TryGetTypeReference(type.FullName, ref result))
			{
				return into.ImportReference(type);
			}
			return result;
		}

		internal static TypeReference GetOrImportTypeReference(ModuleDefinition into, TypeReference type)
		{
			TypeReference result = default(TypeReference);
			if (!into.TryGetTypeReference(((MemberReference)type).FullName, ref result))
			{
				return into.ImportReference(type);
			}
			return result;
		}

		internal abstract CustomAttribute ConvertToAttribute(AssemblyDefinition into);

		internal abstract bool TryMergeInto(TypeDefinition typeDefinition, out IMemberDefinition? memberDefinition);
	}
	internal class EnumInsertionMerge : CessilMerge
	{
		private readonly string EnumEntryName;

		public EnumInsertionMerge(CustomAttribute attribute)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			CustomAttributeArgument val = attribute.ConstructorArguments[1];
			EnumEntryName = (string)((CustomAttributeArgument)(ref val)).Value;
			val = attribute.ConstructorArguments[0];
			base..ctor((TypeReference)((CustomAttributeArgument)(ref val)).Value);
		}

		internal override CustomAttribute ConvertToAttribute(AssemblyDefinition into)
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Expected O, but got Unknown
			TypeReference orImportTypeReference = CessilMerge.GetOrImportTypeReference(into.MainModule, typeof(Type));
			TypeReference orImportTypeReference2 = CessilMerge.GetOrImportTypeReference(into.MainModule, TargetTypeRef);
			CustomAttribute val = new CustomAttribute(into.MainModule.ImportReference((MethodBase)typeof(RequiresEnumInsertionAttribute).GetConstructors().First()));
			val.ConstructorArguments.Add(new CustomAttributeArgument(orImportTypeReference, (object)orImportTypeReference2));
			val.ConstructorArguments.Add(new CustomAttributeArgument(into.MainModule.TypeSystem.String, (object)EnumEntryName));
			return val;
		}

		internal override bool TryMergeInto(TypeDefinition typeDefinition, out IMemberDefinition? memberDefinition)
		{
			memberDefinition = null;
			FieldDefinition fieldDefinition;
			bool flag = CessilHelper.TryCreateField(typeDefinition, EnumEntryName, (TypeReference)(object)typeDefinition, out fieldDefinition, (FieldAttributes)32854);
			long num = -1L;
			foreach (FieldDefinition item in ((IEnumerable<FieldDefinition>)typeDefinition.Fields).Where((FieldDefinition field) => ((MemberReference)field).Name != "value__"))
			{
				if (Convert.ToInt64(item.Constant) > Convert.ToInt64(num))
				{
					num = Convert.ToInt64(item.Constant);
				}
			}
			if (flag)
			{
				fieldDefinition.Constant = Convert.ChangeType(num + 1, Type.GetType(((MemberReference)((FieldReference)((IEnumerable<FieldDefinition>)typeDefinition.Fields).First((FieldDefinition field) => ((MemberReference)field).Name == "value__")).FieldType).FullName) ?? throw new InvalidOperationException());
			}
			if (flag)
			{
				memberDefinition = (IMemberDefinition?)(object)fieldDefinition;
			}
			return flag;
		}
	}
	internal class FieldMerge : CessilMerge
	{
		private readonly string FieldName;

		private readonly TypeReference FieldType;

		private readonly bool IsPublic;

		public FieldMerge(CustomAttribute attribute)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Expected O, but got Unknown
			CustomAttributeArgument val = attribute.ConstructorArguments[1];
			FieldName = (string)((CustomAttributeArgument)(ref val)).Value;
			val = attribute.ConstructorArguments[2];
			FieldType = (TypeReference)((CustomAttributeArgument)(ref val)).Value;
			int isPublic;
			if (attribute.ConstructorArguments.Count > 3)
			{
				val = attribute.ConstructorArguments[3];
				isPublic = (((bool)((CustomAttributeArgument)(ref val)).Value) ? 1 : 0);
			}
			else
			{
				isPublic = 0;
			}
			IsPublic = (byte)isPublic != 0;
			val = attribute.ConstructorArguments[0];
			base..ctor((TypeReference)((CustomAttributeArgument)(ref val)).Value);
		}

		internal override CustomAttribute ConvertToAttribute(AssemblyDefinition into)
		{
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Expected O, but got Unknown
			TypeReference orImportTypeReference = CessilMerge.GetOrImportTypeReference(into.MainModule, typeof(Type));
			TypeReference orImportTypeReference2 = CessilMerge.GetOrImportTypeReference(into.MainModule, TargetTypeRef);
			TypeReference orImportTypeReference3 = CessilMerge.GetOrImportTypeReference(into.MainModule, FieldType);
			CustomAttribute val = new CustomAttribute(into.MainModule.ImportReference((MethodBase)typeof(RequiresFieldAttribute).GetConstructors().First()));
			val.ConstructorArguments.Add(new CustomAttributeArgument(orImportTypeReference, (object)orImportTypeReference2));
			val.ConstructorArguments.Add(new CustomAttributeArgument(into.MainModule.TypeSystem.String, (object)FieldName));
			val.ConstructorArguments.Add(new CustomAttributeArgument(orImportTypeReference, (object)orImportTypeReference3));
			val.ConstructorArguments.Add(new CustomAttributeArgument(into.MainModule.TypeSystem.Boolean, (object)IsPublic));
			return val;
		}

		internal override bool TryMergeInto(TypeDefinition typeDefinition, out IMemberDefinition? memberDefinition)
		{
			memberDefinition = null;
			FieldDefinition fieldDefinition;
			bool flag = CessilHelper.TryCreateField(typeDefinition, FieldName, CessilMerge.GetOrImportTypeReference(((MemberReference)typeDefinition).Module, FieldType), out fieldDefinition, (FieldAttributes)((!IsPublic) ? 1 : 6));
			if (flag)
			{
				memberDefinition = (IMemberDefinition?)(object)fieldDefinition;
			}
			return flag;
		}
	}
	internal class MethodMerge : CessilMerge
	{
		private readonly string MethodName;

		private readonly TypeReference MethodType;

		private readonly TypeReference[] MethodParameters;

		private readonly object[] MethodDefaults;

		public MethodMerge(CustomAttribute attribute)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Expected O, but got Unknown
			CustomAttributeArgument val = attribute.ConstructorArguments[1];
			MethodName = (string)((CustomAttributeArgument)(ref val)).Value;
			val = attribute.ConstructorArguments[2];
			MethodType = (TypeReference)((CustomAttributeArgument)(ref val)).Value;
			val = attribute.ConstructorArguments[3];
			MethodParameters = ((IEnumerable<CustomAttributeArgument>)(CustomAttributeArgument[])((CustomAttributeArgument)(ref val)).Value).Select((Func<CustomAttributeArgument, TypeReference>)((CustomAttributeArgument attr) => (TypeReference)((CustomAttributeArgument)(ref attr)).Value)).ToArray();
			object[] methodDefaults;
			if (attribute.ConstructorArguments.Count <= 4)
			{
				methodDefaults = new object[0];
			}
			else
			{
				val = attribute.ConstructorArguments[4];
				methodDefaults = ((CustomAttributeArgument[])((CustomAttributeArgument)(ref val)).Value).Select((CustomAttributeArgument attr) => ((CustomAttributeArgument)(ref attr)).Value).ToArray();
			}
			MethodDefaults = methodDefaults;
			val = attribute.ConstructorArguments[0];
			base..ctor((TypeReference)((CustomAttributeArgument)(ref val)).Value);
		}

		internal override CustomAttribute ConvertToAttribute(AssemblyDefinition into)
		{
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Expected O, but got Unknown
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			AssemblyDefinition into2 = into;
			TypeReference typeTypeRef = CessilMerge.GetOrImportTypeReference(into2.MainModule, typeof(Type));
			TypeReference orImportTypeReference = CessilMerge.GetOrImportTypeReference(into2.MainModule, TargetTypeRef);
			TypeReference orImportTypeReference2 = CessilMerge.GetOrImportTypeReference(into2.MainModule, MethodType);
			Type type = ((MethodDefaults.Length != 0) ? typeof(RequiresMethodDefaultsAttribute) : typeof(RequiresMethodAttribute));
			CustomAttribute val = new CustomAttribute(into2.MainModule.ImportReference((MethodBase)type.GetConstructors().First()));
			val.ConstructorArguments.Add(new CustomAttributeArgument(typeTypeRef, (object)orImportTypeReference));
			val.ConstructorArguments.Add(new CustomAttributeArgument(into2.MainModule.TypeSystem.String, (object)MethodName));
			val.ConstructorArguments.Add(new CustomAttributeArgument(typeTypeRef, (object)orImportTypeReference2));
			val.ConstructorArguments.Add(new CustomAttributeArgument((TypeReference)(object)TypeReferenceRocks.MakeArrayType(typeTypeRef), (object)((IEnumerable<TypeReference>)MethodParameters).Select((Func<TypeReference, CustomAttributeArgument>)((TypeReference tRef) => new CustomAttributeArgument(typeTypeRef, (object)CessilMerge.GetOrImportTypeReference(into2.MainModule, tRef)))).ToArray()));
			CustomAttribute val2 = val;
			if (MethodDefaults.Length != 0)
			{
				val2.ConstructorArguments.Add(new CustomAttributeArgument((TypeReference)(object)TypeReferenceRocks.MakeArrayType(into2.MainModule.TypeSystem.Object), (object)((IEnumerable<object>)MethodDefaults).Select((Func<object, CustomAttributeArgument>)((object tObj) => new CustomAttributeArgument(into2.MainModule.TypeSystem.Object, tObj))).ToArray()));
			}
			return val2;
		}

		internal override bool TryMergeInto(TypeDefinition typeDefinition, out IMemberDefinition? memberDefinition)
		{
			TypeDefinition typeDefinition2 = typeDefinition;
			memberDefinition = null;
			TypeReference[] importedParamReferences = MethodParameters.Select((TypeReference param) => ((MemberReference)typeDefinition2).Module.ImportReference((TypeReference)(object)param.Resolve())).ToArray();
			MethodDefinition methodDefinition;
			bool flag = CessilHelper.TryCreateMethod(typeDefinition2, MethodName, CessilMerge.GetOrImportTypeReference(((MemberReference)typeDefinition2).Module, MethodType), importedParamReferences, ((IEnumerable<object>)MethodDefaults).Select((Func<object, CustomAttributeArgument>)((object obj) => (CustomAttributeArgument)obj)).ToArray(), out methodDefinition);
			if (flag)
			{
				memberDefinition = (IMemberDefinition?)(object)methodDefinition;
			}
			return flag;
		}
	}
	internal class PropertyMerge : CessilMerge
	{
		private readonly string PropertyName;

		private readonly TypeReference PropertyType;

		private readonly bool InitializeOnAccess;

		public PropertyMerge(CustomAttribute attribute)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Expected O, but got Unknown
			CustomAttributeArgument val = attribute.ConstructorArguments[1];
			PropertyName = (string)((CustomAttributeArgument)(ref val)).Value;
			val = attribute.ConstructorArguments[2];
			PropertyType = (TypeReference)((CustomAttributeArgument)(ref val)).Value;
			val = attribute.ConstructorArguments[3];
			InitializeOnAccess = (bool)((CustomAttributeArgument)(ref val)).Value;
			val = attribute.ConstructorArguments[0];
			base..ctor((TypeReference)((CustomAttributeArgument)(ref val)).Value);
		}

		internal override CustomAttribute ConvertToAttribute(AssemblyDefinition into)
		{
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Expected O, but got Unknown
			TypeReference orImportTypeReference = CessilMerge.GetOrImportTypeReference(into.MainModule, typeof(Type));
			TypeReference orImportTypeReference2 = CessilMerge.GetOrImportTypeReference(into.MainModule, TargetTypeRef);
			TypeReference orImportTypeReference3 = CessilMerge.GetOrImportTypeReference(into.MainModule, PropertyType);
			CustomAttribute val = new CustomAttribute(into.MainModule.ImportReference((MethodBase)typeof(RequiresPropertyAttribute).GetConstructors().First()));
			val.ConstructorArguments.Add(new CustomAttributeArgument(orImportTypeReference, (object)orImportTypeReference2));
			val.ConstructorArguments.Add(new CustomAttributeArgument(into.MainModule.TypeSystem.String, (object)PropertyName));
			val.ConstructorArguments.Add(new CustomAttributeArgument(orImportTypeReference, (object)orImportTypeReference3));
			val.ConstructorArguments.Add(new CustomAttributeArgument(into.MainModule.TypeSystem.Boolean, (object)InitializeOnAccess));
			return val;
		}

		internal override bool TryMergeInto(TypeDefinition typeDefinition, out IMemberDefinition? memberDefinition)
		{
			memberDefinition = null;
			TypeReference orImportTypeReference = CessilMerge.GetOrImportTypeReference(((MemberReference)typeDefinition).Module, PropertyType);
			if (!CessilHelper.TryCreateProperty(typeDefinition, PropertyName, orImportTypeReference, out FieldDefinition backingField, out PropertyDefinition propertyDefinition))
			{
				return false;
			}
			if (InitializeOnAccess)
			{
				AddSingletonCheckToProperty(backingField, PropertyType.Resolve(), propertyDefinition);
			}
			memberDefinition = (IMemberDefinition?)(object)propertyDefinition;
			return true;
		}

		private static void AddSingletonCheckToProperty(FieldDefinition backingField, TypeDefinition resolvedAndImported, PropertyDefinition singletonPropDef)
		{
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			MethodDefinition val = ((IEnumerable<MethodDefinition>)resolvedAndImported.Methods).FirstOrDefault((Func<MethodDefinition, bool>)((MethodDefinition method) => ((MemberReference)method).Name == ".ctor" && ((MethodReference)method).Parameters.Count == 0));
			if (val != null)
			{
				MethodReference val2 = ((MemberReference)backingField).Module.ImportReference((MethodReference)(object)val);
				MethodDefinition getMethod = singletonPropDef.GetMethod;
				getMethod.Body.Instructions.Clear();
				ILProcessor iLProcessor = getMethod.Body.GetILProcessor();
				iLProcessor.Emit(OpCodes.Ldarg_0);
				iLProcessor.Emit(OpCodes.Ldfld, (FieldReference)(object)backingField);
				iLProcessor.Emit(OpCodes.Ldnull);
				iLProcessor.Emit(OpCodes.Ceq);
				Instruction val3 = iLProcessor.Create(OpCodes.Nop);
				iLProcessor.Emit(OpCodes.Brfalse, val3);
				iLProcessor.Emit(OpCodes.Ldarg_0);
				iLProcessor.Emit(OpCodes.Newobj, val2);
				iLProcessor.Emit(OpCodes.Call, (MethodReference)(object)singletonPropDef.SetMethod);
				iLProcessor.Append(val3);
				MethodBodyRocks.OptimizeMacros(getMethod.Body);
				iLProcessor.Emit(OpCodes.Ldarg_0);
				iLProcessor.Emit(OpCodes.Ldfld, (FieldReference)(object)backingField);
				iLProcessor.Emit(OpCodes.Ret);
			}
		}
	}
}
namespace CessilCellsCeaChells.Internal
{
	internal static class AssemblyCacheHandler
	{
		private const string AssemblyCacheDLLPrefix = "CessilCache.";

		internal static bool TryLoadCachedMerges(string assemblyPath, CessilMerger cessilMerger, out CessilMerge[] merges)
		{
			merges = new CessilMerge[0];
			if (!Directory.Exists(cessilMerger.CachePath))
			{
				Directory.CreateDirectory(cessilMerger.CachePath);
			}
			string text = Path.Combine(cessilMerger.CachePath, "CessilCache." + Path.GetFileName(assemblyPath));
			long num = File.GetLastWriteTimeUtc(assemblyPath).ToFileTimeUtc();
			bool flag = File.Exists(text) && File.GetLastWriteTimeUtc(text).ToFileTimeUtc() == num;
			AssemblyDefinition val = LoadAssembly(flag ? text : assemblyPath, cessilMerger);
			if (val == null)
			{
				return false;
			}
			if (flag)
			{
				CessilMerger.LogDebugSafe("Falling back to cached merges for '" + ((AssemblyNameReference)val.Name).Name + "'. Write Time hasn't changed.");
			}
			else
			{
				CessilMerger.LogDebugSafe("Loading and caching merges for '" + ((AssemblyNameReference)val.Name).Name + "'. " + (File.Exists(text) ? "Write Time has changed." : "Cache doesn't exist."));
			}
			if (!CessilMerge.TryCreateMerges(val, out merges))
			{
				CessilMerger.LogDebugSafe("Plugin '" + ((AssemblyNameReference)val.Name).Name + "' doesn't contain any merges.");
			}
			if (!flag)
			{
				CacheMerges(text, val, num, merges);
			}
			return merges.Length != 0;
		}

		internal static AssemblyDefinition? LoadAssembly(string assemblyPath, CessilMerger cessilMerger)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			AssemblyDefinition val = null;
			try
			{
				val = AssemblyDefinition.ReadAssembly(assemblyPath, new ReaderParameters
				{
					ReadWrite = true,
					AssemblyResolver = cessilMerger.TypeResolver
				});
			}
			catch
			{
			}
			if (val != null)
			{
				cessilMerger.AssembliesToDispose.Add(val);
			}
			return val;
		}

		private static void CacheMerges(string cachePath, AssemblyDefinition assemblyDefinition, long writeTime, CessilMerge[] merges)
		{
			if (File.Exists(cachePath))
			{
				File.Delete(cachePath);
			}
			AssemblyDefinition val = AssemblyDefinition.CreateAssembly(assemblyDefinition.Name, ((ModuleReference)assemblyDefinition.MainModule).Name, (ModuleKind)0);
			foreach (CessilMerge cessilMerge in merges)
			{
				val.CustomAttributes.Add(cessilMerge.ConvertToAttribute(val));
			}
			val.Write(cachePath);
			if (File.Exists(cachePath))
			{
				File.SetLastWriteTimeUtc(cachePath, DateTime.FromFileTimeUtc(writeTime));
			}
		}
	}
	internal static class CessilHelper
	{
		internal static bool TryCreateField(TypeDefinition typeDef, string name, TypeReference importedFieldType, out FieldDefinition? fieldDefinition, FieldAttributes customAttributes = 1)
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Expected O, but got Unknown
			//IL_0048: Expected O, but got Unknown
			string name2 = name;
			fieldDefinition = null;
			if (((IEnumerable<FieldDefinition>)typeDef.Fields).Any((FieldDefinition field) => ((MemberReference)field).Name == name2))
			{
				return false;
			}
			Collection<FieldDefinition> fields = typeDef.Fields;
			FieldDefinition val = new FieldDefinition(name2, customAttributes, importedFieldType);
			FieldDefinition val2 = val;
			fieldDefinition = val;
			fields.Add(val2);
			return true;
		}

		internal static bool TryCreateProperty(TypeDefinition typeDef, string name, TypeReference importedPropType, out FieldDefinition? backingField, out PropertyDefinition? propertyDefinition, string fieldNameTemplate = "<{0}>k__BackingField", string methodNameTemplate = "{0}_{1}")
		{
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Expected O, but got Unknown
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Expected O, but got Unknown
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Expected O, but got Unknown
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Expected O, but got Unknown
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: Expected O, but got Unknown
			//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: Expected O, but got Unknown
			//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d1: Expected O, but got Unknown
			//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ea: Expected O, but got Unknown
			//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0208: Unknown result type (might be due to invalid IL or missing references)
			//IL_0215: Unknown result type (might be due to invalid IL or missing references)
			//IL_0224: Unknown result type (might be due to invalid IL or missing references)
			//IL_023f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0244: Unknown result type (might be due to invalid IL or missing references)
			//IL_024c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0255: Unknown result type (might be due to invalid IL or missing references)
			//IL_0258: Expected O, but got Unknown
			//IL_0259: Expected O, but got Unknown
			string name2 = name;
			propertyDefinition = null;
			backingField = null;
			if (((IEnumerable<PropertyDefinition>)typeDef.Properties).Any((PropertyDefinition prop) => ((MemberReference)prop).Name == name2))
			{
				return false;
			}
			if (!TryCreateField(typeDef, string.Format(fieldNameTemplate, name2), importedPropType, out backingField, (FieldAttributes)1))
			{
				return false;
			}
			TypeReference val = default(TypeReference);
			if (!((MemberReference)typeDef).Module.TryGetTypeReference(typeof(CompilerGeneratedAttribute).FullName, ref val))
			{
				val = ((MemberReference)typeDef).Module.ImportReference(typeof(CompilerGeneratedAttribute));
			}
			MethodReference val2 = ((MemberReference)typeDef).Module.ImportReference((MethodReference)(object)((IEnumerable<MethodDefinition>)val.Resolve().Methods).First((MethodDefinition method) => ((MemberReference)method).Name == ".ctor"));
			backingField.CustomAttributes.Add(new CustomAttribute(val2));
			MethodDefinition val3 = new MethodDefinition(string.Format(methodNameTemplate, "get", name2), (MethodAttributes)2182, importedPropType);
			typeDef.Methods.Add(val3);
			val3.Body = new MethodBody(val3);
			val3.CustomAttributes.Add(new CustomAttribute(val2));
			ILProcessor iLProcessor = val3.Body.GetILProcessor();
			iLProcessor.Emit(OpCodes.Ldarg_0);
			iLProcessor.Emit(OpCodes.Ldfld, (FieldReference)(object)backingField);
			iLProcessor.Emit(OpCodes.Ret);
			MethodDefinition val4 = new MethodDefinition(string.Format(methodNameTemplate, "set", name2), (MethodAttributes)2182, ((MemberReference)typeDef).Module.Assembly.MainModule.TypeSystem.Void);
			typeDef.Methods.Add(val4);
			val4.Body = new MethodBody(val4);
			val4.CustomAttributes.Add(new CustomAttribute(val2));
			((MethodReference)val4).Parameters.Add(new ParameterDefinition("value", (ParameterAttributes)0, importedPropType));
			iLProcessor = val4.Body.GetILProcessor();
			iLProcessor.Emit(OpCodes.Ldarg_0);
			iLProcessor.Emit(OpCodes.Ldarg_1);
			iLProcessor.Emit(OpCodes.Stfld, (FieldReference)(object)backingField);
			iLProcessor.Emit(OpCodes.Ret);
			Collection<PropertyDefinition> properties = typeDef.Properties;
			PropertyDefinition val5 = new PropertyDefinition(name2, (PropertyAttributes)0, importedPropType)
			{
				GetMethod = val3,
				SetMethod = val4
			};
			PropertyDefinition val6 = val5;
			propertyDefinition = val5;
			properties.Add(val6);
			return true;
		}

		internal static bool TryCreateMethod(TypeDefinition typeDef, string name, TypeReference importedReturnType, TypeReference[] importedParamReferences, CustomAttributeArgument[] constants, out MethodDefinition? methodDefinition)
		{
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Expected O, but got Unknown
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0215: Unknown result type (might be due to invalid IL or missing references)
			//IL_021c: Expected O, but got Unknown
			//IL_0303: Unknown result type (might be due to invalid IL or missing references)
			//IL_0308: Unknown result type (might be due to invalid IL or missing references)
			string name2 = name;
			TypeReference[] importedParamReferences2 = importedParamReferences;
			methodDefinition = null;
			if (((IEnumerable<MethodDefinition>)typeDef.Methods).Any((MethodDefinition method) => ((MemberReference)method).Name == name2 && ParameterTypesMatch(((IEnumerable<ParameterDefinition>)((MethodReference)method).Parameters).Select((ParameterDefinition param) => ((ParameterReference)param).ParameterType).ToArray(), importedParamReferences2)))
			{
				return false;
			}
			MethodDefinition val = new MethodDefinition(name2, (MethodAttributes)134, importedReturnType);
			val.Body.InitLocals = true;
			methodDefinition = val;
			methodDefinition.Body.GetILProcessor().Emit(OpCodes.Ret);
			Dictionary<string, int> dictionary = new Dictionary<string, int>();
			Dictionary<string, int> dictionary2 = new Dictionary<string, int>();
			TypeReference[] array = importedParamReferences2;
			foreach (TypeReference val2 in array)
			{
				string key = (val2.IsGenericInstance ? ((MemberReference)val2).Name.Substring(0, ((MemberReference)val2).Name.IndexOf('`')) : ((MemberReference)val2).Name);
				if (!dictionary2.ContainsKey(key))
				{
					dictionary2.Add(key, 0);
				}
				if (!dictionary.ContainsKey(key))
				{
					dictionary.Add(key, 0);
				}
				dictionary[key]++;
			}
			for (int j = 0; j < importedParamReferences2.Length; j++)
			{
				TypeReference val3 = importedParamReferences2[j];
				string text = (val3.IsGenericInstance ? ((MemberReference)val3).Name.Substring(0, ((MemberReference)val3).Name.IndexOf('`')) : ((MemberReference)val3).Name);
				int num = dictionary[text];
				int num2 = dictionary2[text]++;
				string text2 = "p" + text + ((num > 1) ? ("_" + num2) : "");
				int num3 = importedParamReferences2.Length - constants.Length;
				int num4 = j - num3;
				bool flag = constants.Length != 0 && j >= num3 && ((MemberReference)((CustomAttributeArgument)(ref constants[num4])).Type).FullName == ((MemberReference)val3).FullName;
				ParameterDefinition val4 = new ParameterDefinition(text2, (ParameterAttributes)(flag ? 16 : 0), val3);
				if (num4 >= 0 && constants.Length > num4 && ((MemberReference)((CustomAttributeArgument)(ref constants[num4])).Type).FullName != ((MemberReference)val3).FullName)
				{
					CessilMerger.LogWarnSafe($"Ignoring parameter constant @ {j + 1}, and all preceding parameters, for " + "'" + ((MemberReference)typeDef).FullName + "::" + ((MemberReference)methodDefinition).Name + "' because '" + ((MemberReference)((CustomAttributeArgument)(ref constants[num4])).Type).FullName + "' is not the correct type! It should be '" + ((MemberReference)val3).FullName + "'.");
				}
				if (flag)
				{
					val4.Constant = ((CustomAttributeArgument)(ref constants[num4])).Value;
				}
				else
				{
					Enumerator<ParameterDefinition> enumerator = ((MethodReference)methodDefinition).Parameters.GetEnumerator();
					try
					{
						while (enumerator.MoveNext())
						{
							ParameterDefinition current = enumerator.Current;
							current.Constant = null;
							current.Attributes = (ParameterAttributes)0;
						}
					}
					finally
					{
						((IDisposable)enumerator).Dispose();
					}
				}
				((MethodReference)methodDefinition).Parameters.Add(val4);
			}
			typeDef.Methods.Add(methodDefinition);
			return true;
		}

		private static bool ParameterTypesMatch(TypeReference[] parametersFrom, TypeReference[] parametersTo)
		{
			return parametersFrom.Select((TypeReference type) => ((MemberReference)type).FullName).SequenceEqual(parametersTo.Select((TypeReference type) => ((MemberReference)type).FullName));
		}
	}
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	public abstract class RequiresAttribute : Attribute
	{
	}
}
namespace CessilCellsCeaChells.CeaChore
{
	public class RequiresFieldAttribute : RequiresAttribute
	{
		public RequiresFieldAttribute(Type targetType, string fieldName, Type fieldType, bool isPublic = false)
		{
		}
	}
	public class RequiresPropertyAttribute : RequiresAttribute
	{
		public RequiresPropertyAttribute(Type targetType, string propertyName, Type propertyType, bool singletonCreateOnAccess = false)
		{
		}
	}
	public class RequiresMethodAttribute : RequiresAttribute
	{
		public RequiresMethodAttribute(Type targetType, string methodName, Type returnType, params Type[] arguments)
		{
		}
	}
	public class RequiresMethodDefaultsAttribute : RequiresAttribute
	{
		public RequiresMethodDefaultsAttribute(Type targetType, string methodName, Type returnType, Type[] argumentTypes, object[] argumentDefaults)
		{
		}
	}
	public class RequiresEnumInsertionAttribute : RequiresAttribute
	{
		public RequiresEnumInsertionAttribute(Type targetType, string entryName)
		{
		}
	}
}

BepInEx/patchers/CessilCellsCeaChells/CessilCellsCeaChells.Preloader.dll

Decompiled 4 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Cryptography;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Logging;
using Microsoft.CodeAnalysis;
using Mono.Cecil;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyCompany("CessilCellsCeaChells.Preloader")]
[assembly: AssemblyConfiguration("Mono10")]
[assembly: AssemblyFileVersion("0.3.6.0")]
[assembly: AssemblyInformationalVersion("0.3.6+7d89ac2f0f27f18bdede1a7a48d74cf17c6333f1")]
[assembly: AssemblyProduct("CessilCellsCeaChells.Preloader")]
[assembly: AssemblyTitle("CessilCellsCeaChells.Preloader")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.3.6.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace CessilCellsCeaChells.Preloader
{
	internal static class CessilCellsCeaChellsDownByTheCeaChore
	{
		public static IEnumerable<string> TargetDLLs => Merger.TargetDLLFileNames;

		private static CessilMerger Merger { get; } = new CessilMerger();


		private static ManualLogSource Logger { get; } = Logger.CreateLogSource("CessilCellsCeaChellsDownByTheCeaChore");


		public static void Initialize()
		{
			CessilMerger.LogDebug += Logger.LogDebug;
			CessilMerger.LogWarn += Logger.LogWarning;
			Merger.CachePath = Path.Combine(Paths.CachePath, "CessilCellsCeaChellsDownByTheCeaChore");
			Merger.TypeResolver = (IAssemblyResolver)(object)TypeLoader.Resolver;
			LoadPlugins();
			Logger.LogInfo((object)"Initialized!");
		}

		private static void LoadPlugins()
		{
			string text = Paths.PluginPath ?? "";
			if (!Directory.Exists(text))
			{
				throw new ArgumentException("Invalid plugin directory!", text);
			}
			int num = default(int);
			foreach (string item in Directory.GetFiles(text, "*.dll", SearchOption.AllDirectories).OrderBy(delegate(string path)
			{
				using SHA256 sHA = SHA256.Create();
				string text2 = path.Replace(Paths.PluginPath, "");
				int num2 = sHA.ComputeHash(Encoding.UTF8.GetBytes(text2)).Aggregate(0, (int i, byte b) => i + b);
				Logger.LogDebug((object)$"Hashed '{text2}' to '{num2}'");
				return num2;
			}))
			{
				if (Merger.LoadMergesFrom(item, ref num))
				{
					Logger.LogInfo((object)string.Format("Successfully loaded {0} merge{1} from '{2}'", num, (num == 1) ? "" : "s", Path.GetFileName(item)));
				}
			}
		}

		public static void Patch(AssemblyDefinition assembly)
		{
			Logger.LogInfo((object)("Patching '" + ((AssemblyNameReference)assembly.Name).Name + "'.."));
			Merger.MergeInto(assembly);
			if (!Directory.Exists(Paths.CachePath))
			{
				Directory.CreateDirectory(Paths.CachePath);
			}
			string text = Path.Combine(Paths.CachePath, "Cessil." + ((AssemblyNameReference)assembly.Name).Name + ".dll");
			assembly.Write(text);
			Logger.LogInfo((object)("Patching '" + ((AssemblyNameReference)assembly.Name).Name + "' done! Cached to '" + text + "'"));
		}

		public static void Finish()
		{
			Merger.Dispose();
			Logger.LogInfo((object)"Finished!");
		}
	}
}