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:
Marton Suranyi
2017-11-06 20:30:48 +01:00
parent 004dcc19dc
commit 25a708a3d4

View File

@@ -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))