Search code examples
c#.net-assemblyappdomain

.net automatic assembly resolve loads duplicate assembly


I have an executable that depends on a library. I also have a "loader" application, which loads the executable into a seperate AppDomain (my "sandbox") and runs it there. The library needs initialization from outside the sandbox, so I need to load the library before I load the executable. This works as expected, but when I now load the executable, the library is loaded another time, and the executable uses the uninitialized copy.

This only occurs if I load the library like this:

 Assembly.Load(File.ReadAllBytes(assemblyFile.FullName));

instead of this:

Assembly.LoadFrom(assemblyFile.FullName);

However, using LoadFrom locks the file. I need to be able to delete/write the file, because my application needs to be able to reload the entire sandbox and all assemblies in it.

I also tried registering AppDomain.AssemblyResolve, but it is only called if it does not find the file, which isn't exactly what I want ...

Example log output:

  • Loading library X <- manual load
  • Initializing library X
  • Loading executable Y
  • Loading library X <- bad, i want to use the loaded X!

So my question is: How do I force .net to use the already loaded assembly instead of loading a duplicate?


Solution

  • I ended up modifying my AppDomainSetup of the sandbox:

    domainSetup.DisallowApplicationBaseProbing = true;
    

    Now, AssemblyResolve will be called everytime (no autodiscover for assemblies). Now I can just load assemblies from a byte[] and cache them (thanks to @DanField who suggested caching assemblies)