I\'m trying to use AppDomain.AssemblyResolve
event to handle exceptions while resolving Assemblies of some dll loaded at runtime (SerializationException for dyn
If you know list of assemblies that may contain type you are planning to deserialize it could be better to simply pre-load all assemblies before doing serialization.
When AssemblyResolve event is fired you have no information about what type caused the load, but only assembly name. It is unclear why you would look up assembly by some particular type in this case.
Note that if 2 assemblies happen to have the same identity (i.e. file name in non-strongly-signed case) and one is already loaded event will not fire when you expect even if type is not found in already loaded assembly.
Link to the article for historical purposes: Resolving Assembly Loads.
You can define a dictionary of the assemblies from your directory, like this:
private readonly IDictionary<string,Assembly> additional =
new Dictionary<string,Assembly>();
Load this dictionary with the assemblies from your known directory, like this:
foreach ( var assemblyName ... corresponding to DLL names in your directory... ) {
var assembly = Assembly.Load(assemblyName);
additional.Add(assembly.FullName, assembly);
}
Provide an implementation for the hook...
private Assembly ResolveAssembly(Object sender, ResolveEventArgs e) {
Assembly res;
additional.TryGetValue(e.Name, out res);
return res;
}
...and hook it up to the event:
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += ResolveAssembly;
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly;
This should do the trick.