Fix for the change to Assembly.LoadFile() no longer correctly handling plugin's local dll dependencies. We still have to use LoadFile() to allow duplicate names, but now we also have to fixup assembly resolution to 'restore' the default behavior. This adds a global appdomain handler that just tries to load dependencies from the local directory of the requesting dll, if other methods have already failed.

This commit is contained in:
meli 2020-03-24 20:05:48 -07:00
parent d47d70c012
commit ad6bf53a6d

View file

@ -26,6 +26,22 @@ namespace Dalamud.Plugin
this.devPluginDirectory = devPluginDirectory;
this.pluginConfigs = new PluginConfigurations(Path.Combine(Path.GetDirectoryName(dalamud.StartInfo.ConfigurationPath), "pluginConfigs"));
// Try to load missing assemblies from the local directory of the requesting assembly
// This would usually be implicit when using Assembly.Load(), but Assembly.LoadFile() doesn't do it...
// This handler should only be invoked on things that fail regular lookups, but it *is* global to this appdomain
AppDomain.CurrentDomain.AssemblyResolve += (object source, ResolveEventArgs e) =>
{
Log.Debug($"Resolving missing assembly {e.Name}");
// This looks weird but I'm pretty sure it's actually correct. Pretty sure. Probably.
var assemblyPath = Path.Combine(Path.GetDirectoryName(e.RequestingAssembly.Location), new AssemblyName(e.Name).Name + ".dll");
if (!File.Exists(assemblyPath))
{
Log.Error($"Assembly not found at {assemblyPath}");
return null;
}
return Assembly.LoadFrom(assemblyPath);
};
}
public void UnloadPlugins() {