static void CreateUnityProject() { Project.Create(); Simplify.SimplifyLib("Assembly-CSharp.dll", "simplified-kingmaker.dll"); Simplify.SimplifyLib("Assembly-CSharp-FirstPass.dll", "simplified-kingmaker-FirstPass.dll"); ILSpy.DecompileProject("simplified-kingmaker.dll", $"{ProjectDir}/Assets/Kingmaker"); ILSpy.DecompileProject("simplified-kingmaker-firstPass.dll", $"{ProjectDir}/Assets/Standard Assets"); }
static void CreateUnityProject() { Project.Create(); Simplify.RunTest("Assembly-CSharp.dll", "simplified-kingmaker.dll"); Simplify.RunTest("Assembly-CSharp-FirstPass.dll", "simplified-kingmaker-FirstPass.dll"); var outputDir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); TestILSpy.RunTest("simplified-kingmaker.dll", $"{ProjectDir}/Assets/Kingmaker"); TestILSpy.RunTest("simplified-kingmaker-firstPass.dll", $"{ProjectDir}/Assets/Standard Assets"); }
static void DecompileAll() { var unityAssemblies = new string[] { "Unity.Analytics.DataPrivacy.dll", "UnityEngine.AccessibilityModule.dll", "UnityEngine.AIModule.dll", "UnityEngine.Analytics.dll", "UnityEngine.AnimationModule.dll", "UnityEngine.ARModule.dll", "UnityEngine.AssetBundleModule.dll", "UnityEngine.AudioModule.dll", "UnityEngine.BaselibModule.dll", "UnityEngine.ClothModule.dll", "UnityEngine.CloudWebServicesModule.dll", "UnityEngine.ClusterInputModule.dll", "UnityEngine.ClusterRendererModule.dll", "UnityEngine.CoreModule.dll", "UnityEngine.CrashReportingModule.dll", "UnityEngine.DirectorModule.dll", "UnityEngine.dll", "UnityEngine.FacebookModule.dll", "UnityEngine.GameCenterModule.dll", "UnityEngine.GridModule.dll", "UnityEngine.HotReloadModule.dll", "UnityEngine.ImageConversionModule.dll", "UnityEngine.IMGUIModule.dll", "UnityEngine.InputModule.dll", "UnityEngine.JSONSerializeModule.dll", "UnityEngine.Networking.dll", "UnityEngine.ParticlesLegacyModule.dll", "UnityEngine.ParticleSystemModule.dll", "UnityEngine.PerformanceReportingModule.dll", "UnityEngine.Physics2DModule.dll", "UnityEngine.PhysicsModule.dll", "UnityEngine.ScreenCaptureModule.dll", "UnityEngine.SharedInternalsModule.dll", "UnityEngine.SpatialTracking.dll", "UnityEngine.SpatialTrackingModule.dll", "UnityEngine.SpriteMaskModule.dll", "UnityEngine.SpriteShapeModule.dll", "UnityEngine.StandardEvents.dll", "UnityEngine.StyleSheetsModule.dll", "UnityEngine.SubstanceModule.dll", "UnityEngine.TerrainModule.dll", "UnityEngine.TerrainPhysicsModule.dll", "UnityEngine.TextRenderingModule.dll", "UnityEngine.TilemapModule.dll", "UnityEngine.Timeline.dll", "UnityEngine.TimelineModule.dll", "UnityEngine.TLSModule.dll", "UnityEngine.UI.dll", "UnityEngine.UIElementsModule.dll", "UnityEngine.UIModule.dll", "UnityEngine.UmbraModule.dll", "UnityEngine.UNETModule.dll", "UnityEngine.UnityAnalyticsModule.dll", "UnityEngine.UnityConnectModule.dll", "UnityEngine.UnityWebRequestAssetBundleModule.dll", "UnityEngine.UnityWebRequestAudioModule.dll", "UnityEngine.UnityWebRequestModule.dll", "UnityEngine.UnityWebRequestTextureModule.dll", "UnityEngine.UnityWebRequestWWWModule.dll", "UnityEngine.VehiclesModule.dll", "UnityEngine.VideoModule.dll", "UnityEngine.VRModule.dll", "UnityEngine.WebModule.dll", "UnityEngine.WindModule.dll", "UnityEngine.XRModule.dll", }; var thirdParty = new string[] { "AuraSupportPlugin.dll", "DemiLib.dll", "DOTween.dll", "DOTween46.dll", "DOTweenPro.dll", "Pathfinding.ClipperLib.dll", "Pathfinding.Ionic.Zip.Reduced.dll", "Pathfinding.JsonFx.dll", "Pathfinding.Poly2Tri.dll", "Kingmaker.Import.dll", }; var mainAssemblies = new string[] { "Assembly-CSharp.dll", "Assembly-CSharp-FirstPass.dll" }; foreach (var assembly in unityAssemblies) { Simplify.RunTest(assembly, $"simplified-{assembly}"); TestILSpy.RunTest($"simplified-{assembly}", $"{ProjectDir}/UnityEngine"); } foreach (var assembly in mainAssemblies) { Simplify.RunTest(assembly, $"simplified-{assembly}"); TestILSpy.RunTest($"simplified-{assembly}", $"{ProjectDir}/{assembly.Replace(".dll", "")}"); } foreach (var assembly in thirdParty) { Simplify.RunTest(assembly, $"simplified-{assembly}"); TestILSpy.RunTest($"simplified-{assembly}", $"{ProjectDir}/ThirdParty"); } }
public static void SimplifyLib(string assemblyName, string outputPath) { var simplify = new Simplify(); ModuleDefMD mod = ModuleDefMD.Load(Path.Combine(Program.ManagedDir, assemblyName)); var structRef = new TypeRefUser(mod, "System", "ValueType", mod.CorLibTypes.AssemblyRef); var exceptionRef = new TypeRefUser(mod, "System", "NotImplementedException", mod.CorLibTypes.AssemblyRef); var exceptionCtor = new MemberRefUser(mod, ".ctor", MethodSig.CreateInstance(exceptionRef.ToTypeSig()), exceptionRef); simplify.NotImplementedBody = new List <Instruction>() { OpCodes.Nop.ToInstruction(), OpCodes.Newobj.ToInstruction(exceptionCtor), OpCodes.Throw.ToInstruction() }; Console.WriteLine($"Simplifying {assemblyName}"); var AttributeBlackList = new HashSet <string>() { "System.Runtime.CompilerServices.AsyncStateMachineAttribute", "System.Diagnostics.DebuggerHiddenAttribute", "System.Security.SecurityCriticalAttribute" }; var MethodWhiteList = new HashSet <string>() { "System.Void QuickGraph.SUndirectedTaggedEdge`2::add_TagChanged(System.EventHandler)", "System.Void QuickGraph.SUndirectedTaggedEdge`2::remove_TagChanged(System.EventHandler)", "System.Void QuickGraph.STaggedEquatableEdge`2::add_TagChanged(System.EventHandler)", "System.Void QuickGraph.STaggedEquatableEdge`2::remove_TagChanged(System.EventHandler)", "System.Void QuickGraph.STaggedEdge`2::add_TagChanged(System.EventHandler)", "System.Void QuickGraph.STaggedEdge`2::remove_TagChanged(System.EventHandler)", "System.Void Steamworks.CallResult`1::add_m_Func(Steamworks.CallResult`1/APIDispatchDelegate<T>)", "System.Void Steamworks.CallResult`1::remove_m_Func(Steamworks.CallResult`1/APIDispatchDelegate<T>)", "Kingmaker.Utility.Feet Kingmaker.Utility.FeetExtension::Feet(System.Int32)", "Kingmaker.UnitLogic.Mechanics.ContextValue Kingmaker.UnitLogic.Mechanics.ContextValue::op_Implicit(System.Int32)", "System.Boolean Kingmaker.UnitLogic.Customization.UnitCustomizationVariation::Equals(Kingmaker.UnitLogic.Customization.UnitCustomizationVariation)", "System.Boolean Kingmaker.UnitLogic.Customization.UnitCustomizationVariation::Equals(System.Object)", }; var PropertyWhiteList = new HashSet <string>() { "System.String UnityEngine.CreateAssetMenuAttribute::menuName()", "System.String UnityEngine.CreateAssetMenuAttribute::ileName()", "System.Int32 UnityEngine.CreateAssetMenuAttribute::order()", "System.String UnityEngine.Bindings.NativeTypeAttribute::Header()", "Kingmaker.Blueprints.BlueprintComponent Kingmaker.Blueprints.BlueprintScriptableObject::ComponentsArray()", "UnityEngine.Color UnityEngine.Color::red()", "UnityEngine.Color UnityEngine.Color::green()", "UnityEngine.Color UnityEngine.Color::blue()", "UnityEngine.Color UnityEngine.Color::white()", "UnityEngine.Color UnityEngine.Color::black()", "UnityEngine.Color UnityEngine.Color::yellow()", "UnityEngine.Color UnityEngine.Color::cyan()", "UnityEngine.Color UnityEngine.Color::magenta()", "UnityEngine.Color UnityEngine.Color::gray()", "UnityEngine.Color UnityEngine.Color::grey()", "UnityEngine.Color UnityEngine.Color::clear()", "UnityEngine.Vector3 UnityEngine.Vector3::zero()", "UnityEngine.Vector3 UnityEngine.Vector3::one()", "UnityEngine.Vector3 UnityEngine.Vector3::up()", "UnityEngine.Vector3 UnityEngine.Vector3::down()", "UnityEngine.Vector3 UnityEngine.Vector3::left()", "UnityEngine.Vector3 UnityEngine.Vector3::right()", "UnityEngine.Vector3 UnityEngine.Vector3::forward()", "UnityEngine.Vector3 UnityEngine.Vector3::back()", "UnityEngine.Vector3 UnityEngine.Vector3::positiveInfinity()", "UnityEngine.Vector3 UnityEngine.Vector3::negativeInfinity()", }; RemoveInterfaceProperties(mod); foreach (var type in mod.GetTypes()) { foreach (var property in type.Properties.ToArray()) { /* * Properties must be changed or preserved in unison * removing a getter body while keeping the setter body causes the * setter to become recursive * PropertyName { * getter { throw new NotImplementedException() } * setter { PropertyName = value } * } * TODO: Look at replacing properties with default implemtation * PropertyName { get; set; } */ if (PropertyWhiteList.Contains(property.FullName)) { continue; } var getter = property.GetMethod; var setter = property.SetMethod; bool canSkipGetter = getter == null || !getter.HasBody || getter.Body.Instructions.Count <= 3; bool canSkipSetter = getter == null || !getter.HasBody || getter.Body.Instructions.Count <= 4; if (canSkipGetter && canSkipSetter) { continue; } if (getter != null && getter.HasBody) { simplify.ClearMethod(getter); } if (setter != null && setter.HasBody) { simplify.ClearMethod(setter); } } foreach (var method in type.Methods.ToArray()) { if (method.IsGetter || method.IsSetter) { continue; } if (MethodWhiteList.Contains(method.FullName)) { continue; } foreach (var att in method.CustomAttributes.ToArray()) { if (AttributeBlackList.Contains(att.TypeFullName)) { method.CustomAttributes.Remove(att); } } simplify.ClearMethod(method); } } simplify.ManualFixes(mod); mod.Write(Path.Combine(Program.ManagedDir, outputPath)); }