PluginManager: load dependent DLLs first
When there are dependencies among a plugin's DLLs, those dependencies needs a custom resolving.
This commit is contained in:
@@ -241,10 +241,10 @@ namespace Torch.Managers
|
|||||||
stream.Read(data, 0, data.Length);
|
stream.Read(data, 0, data.Length);
|
||||||
Assembly asm = Assembly.Load(data);
|
Assembly asm = Assembly.Load(data);
|
||||||
assemblies.Add(asm);
|
assemblies.Add(asm);
|
||||||
TorchBase.RegisterAuxAssembly(asm);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RegisterAllAssemblies(assemblies);
|
||||||
InstantiatePlugin(manifest, assemblies);
|
InstantiatePlugin(manifest, assemblies);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,15 +271,47 @@ namespace Torch.Managers
|
|||||||
var data = new byte[entry.Length];
|
var data = new byte[entry.Length];
|
||||||
stream.Read(data, 0, data.Length);
|
stream.Read(data, 0, data.Length);
|
||||||
Assembly asm = Assembly.Load(data);
|
Assembly asm = Assembly.Load(data);
|
||||||
TorchBase.RegisterAuxAssembly(asm);
|
|
||||||
assemblies.Add(asm);
|
assemblies.Add(asm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RegisterAllAssemblies(assemblies);
|
||||||
InstantiatePlugin(manifest, assemblies);
|
InstantiatePlugin(manifest, assemblies);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void RegisterAllAssemblies(IEnumerable<Assembly> assemblies)
|
||||||
|
{
|
||||||
|
ResolveEventHandler resolveDependentAssembly = (object sender, ResolveEventArgs args) =>
|
||||||
|
{
|
||||||
|
var requiredAssemblyName = new AssemblyName(args.Name);
|
||||||
|
foreach (Assembly asm in assemblies)
|
||||||
|
{
|
||||||
|
if (IsAssemblyCompatible(requiredAssemblyName, asm.GetName()))
|
||||||
|
return asm;
|
||||||
|
}
|
||||||
|
throw new Exception($"Could find dependent assembly! Requesting assembly: {args.RequestingAssembly}, dependent assembly: {requiredAssemblyName}");
|
||||||
|
};
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
AppDomain.CurrentDomain.AssemblyResolve += resolveDependentAssembly;
|
||||||
|
foreach (Assembly asm in assemblies)
|
||||||
|
{
|
||||||
|
TorchBase.RegisterAuxAssembly(asm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
AppDomain.CurrentDomain.AssemblyResolve -= resolveDependentAssembly;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsAssemblyCompatible(AssemblyName a, AssemblyName b)
|
||||||
|
{
|
||||||
|
return a.Name == b.Name && a.Version.Major == b.Version.Major && a.Version.Minor == b.Version.Minor;
|
||||||
|
}
|
||||||
|
|
||||||
private PluginManifest GetManifestFromZip(string path)
|
private PluginManifest GetManifestFromZip(string path)
|
||||||
{
|
{
|
||||||
using (var zipFile = ZipFile.OpenRead(path))
|
using (var zipFile = ZipFile.OpenRead(path))
|
||||||
|
Reference in New Issue
Block a user