Hello again.
I had some health problems and less free time to work on this issue, which is why it took me this long for this :
I tried to apply suggestions from Mike Danes, however i still get the same result : FileNotFoundException.
When i use VS to check the operations step by step, i can see the program found the right dll and loaded it, however it seems it is unable to find it's dependencies.
Here is the Fusion Log i got that has weird paths :
=== Pre-bind state information ===
LOG: DisplayName = WAM.Modules.AlertScanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = file:///E:/Projects/VS/Warframe Activity Manager/WAM.Desktop/bin/Debug/
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: E:\Projects\VS\Warframe Activity Manager\WAM.Desktop\bin\Debug\WAM.Desktop.exe.config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///E:/Projects/VS/Warframe Activity Manager/WAM.Desktop/bin/Debug/WAM.Modules.AlertScanner.DLL.
LOG: Attempting download of new URL file:///E:/Projects/VS/Warframe Activity Manager/WAM.Desktop/bin/Debug/WAM.Modules.AlertScanner/WAM.Modules.AlertScanner.DLL.
LOG: Attempting download of new URL file:///E:/Projects/VS/Warframe Activity Manager/WAM.Desktop/bin/Debug/WAM.Modules.AlertScanner.EXE.
LOG: Attempting download of new URL file:///E:/Projects/VS/Warframe Activity Manager/WAM.Desktop/bin/Debug/WAM.Modules.AlertScanner/WAM.Modules.AlertScanner.EXE.
The first wrong thing is the he first attempt to download the assemblt file in file:///E:/Projects/VS/Warframe Activity Manager/WAM.Desktop/bin/Debug/WAM.Modules.AlertScanner.DLL. The path is the application path, not the path to the modules fodler which should be http://file/E:\Projects\VS\Warframe Activity Manager\Modules\Debug\AlertScanner. The same applies to the next attempts.
I have added a class file in the WAM.Common.Core.dll assembly :
using System; using System.IO; using System.Reflection; namespace WAM.Common.Core { public class PluginAssemblyLoader : MarshalByRefObject { public Assembly GetAssembly(String path) { try { return Assembly.LoadFile(Path.GetFileNameWithoutExtension(path)); } catch (Exception) { return null; // throw new InvalidOperationException(ex); } } } }
And the plugin manager code looks as this :
public Plugin(String path, Type moduleType) { if (String.IsNullOrEmpty(path)) throw new ArgumentException("Plugin : path is null or empty"); if (moduleType == null) throw new ArgumentException("Plugin : moduleType is null"); _moduleType = moduleType; AppDomainSetup s = new AppDomainSetup(); s.ApplicationName = Path.GetFileNameWithoutExtension(path); s.ApplicationBase = Path.GetDirectoryName(path); s.CachePath = Path.Combine(Path.GetDirectoryName(path), "cache" + Path.DirectorySeparatorChar); s.ShadowCopyFiles = "true"; s.ShadowCopyDirectories = Path.Combine(Path.GetDirectoryName(path), "sc" + Path.DirectorySeparatorChar); _domain = AppDomain.CreateDomain(Path.GetFileNameWithoutExtension(path), null, s); Type type = typeof(PluginAssemblyLoader); PluginAssemblyLoader loader = (PluginAssemblyLoader)_domain.CreateInstanceAndUnwrap( type.Assembly.FullName, type.FullName); _assembly = loader.GetAssembly(path); var assemblies = _domain.GetAssemblies(); foreach (var ass in assemblies) { try { foreach (IList<Type> t in ass.GetTypes()) { foreach (var tpe in t) if (_moduleType.IsAssignableFrom(tpe)) _modules.Add(tpe); } } catch (Exception) { break; } } }
Another thing that bothers me is that catch should catch the exceptions thrown by Assembly.LoadFile() and only return null, but i still get it once PluginAssemblyLoader.GetAssembly() returns. Is that normal?
No comments:
Post a Comment