Add infrastructure to support multiple execution environments

This commit is contained in:
Stone_Red
2025-12-26 13:31:14 +01:00
parent 8211825bef
commit 252aca98b4
7 changed files with 296 additions and 158 deletions
@@ -0,0 +1,40 @@
using System.Reflection;
namespace RemoteExec.Server.Utilities;
public static class AssemblyUtilities
{
public static async Task PreLoadReferencedAssembliesAsync(RemoteJobAssemblyLoadContext assemblyLoadContext, Assembly assembly, Func<string, Task<byte[]>> requestAssembly)
{
AssemblyName[] referencedAssemblies = assembly.GetReferencedAssemblies();
foreach (AssemblyName referencedAssembly in referencedAssemblies)
{
// Try to load from the assembly load context first
Assembly? loadedAssembly = assemblyLoadContext.Assemblies.FirstOrDefault(a => a.GetName().FullName == referencedAssembly.FullName);
if (loadedAssembly != null)
{
continue; // Already loaded in the context
}
// Try to load from default context (BCL assemblies)
try
{
_ = assemblyLoadContext.LoadFromAssemblyName(referencedAssembly);
continue; // Successfully loaded from default context
}
catch
{
byte[] assemblyBytes = await requestAssembly(referencedAssembly.FullName!);
_ = assemblyLoadContext.LoadFromBytes(assemblyBytes);
}
}
}
public static Assembly LoadFromBytes(this RemoteJobAssemblyLoadContext assemblyLoadContext, byte[] assemblyBytes)
{
using MemoryStream ms = new(assemblyBytes);
return assemblyLoadContext.LoadFromStream(ms);
}
}