From 80a7d2167375cde4803a918220f58785dd2dcb84 Mon Sep 17 00:00:00 2001 From: MnFeN Date: Sat, 20 Jul 2024 20:26:24 -0700 Subject: [PATCH] fix: Allow using currently loaded assemblies in scripts such as System.Text.Json, or those from other plugins --- Source/Triggernometry/Interpreter.cs | 61 +++++++++++++++++----------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/Source/Triggernometry/Interpreter.cs b/Source/Triggernometry/Interpreter.cs index 85eebad..1b4c946 100644 --- a/Source/Triggernometry/Interpreter.cs +++ b/Source/Triggernometry/Interpreter.cs @@ -326,27 +326,7 @@ public Interpreter() var asms = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly asm in asms) { - try - { - _so = _so.AddReferences(asm); - } - catch (Exception) - { - try - { - MethodInfo grb = asm.GetType().GetMethod("GetRawBytes", BindingFlags.Instance | BindingFlags.NonPublic); - byte[] asmb = (byte[])grb.Invoke(asm, null); - if (asmb == null || asmb.Length == 0) - { - continue; - } - PortableExecutableReference pe = MetadataReference.CreateFromImage(asmb); - _so = _so.AddReferences(pe); - } - catch (Exception) - { - } - } + _so = _so.AddMetadataReferenceFromAssembly(asm); } _so = _so.AddImports("System"); Evaluate("int whee;", null, new Context() { plug = RealPlugin.plug }); @@ -404,8 +384,14 @@ public void Evaluate(string command, string assy, Context ctx) ScriptOptions _myso = _so.WithAllowUnsafe(GetUnsafeUsage(ctx)); if (assy != null) { - string[] assys = assy.Split(','); - _myso = _myso.AddReferences(assys.Select(x => x.Trim())); + var assys = assy.Split(',').Select(x => x.Trim()); + var currentAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (var asmName in assys) + { + var assembly = currentAssemblies.FirstOrDefault(a => a.GetName().Name.Equals(asmName, StringComparison.OrdinalIgnoreCase)); + // try to first load from current assemblies (including the assemblies loaded into memory by ACT which were not detected during InitPlugin) + _myso = (assembly != null) ? _myso.AddMetadataReferenceFromAssembly(assembly) : _myso.AddReferences(asmName); + } } string[] badApis = GetBadApis(ctx); if (badApis != null && badApis.Length > 0) @@ -472,4 +458,33 @@ public void Evaluate(string command, string assy, Context ctx) } + public static class ScriptOptionsExtensions + { + public static ScriptOptions AddMetadataReferenceFromAssembly(this ScriptOptions options, Assembly asm) + { + try + { + options = options.AddReferences(asm); + } + catch (Exception) + { + try + { + MethodInfo grb = asm.GetType().GetMethod("GetRawBytes", BindingFlags.Instance | BindingFlags.NonPublic); + byte[] asmb = (byte[])grb.Invoke(asm, null); + if (asmb == null || asmb.Length == 0) + { + return options; + } + PortableExecutableReference pe = MetadataReference.CreateFromImage(asmb); + options = options.AddReferences(pe); + } + catch (Exception) + { + } + } + return options; + } + } + }