I’m loading a DLL
via System.Reflection.Assembly.LoadFile
and reflecting over it’s members in a plugin-esque system.
I need to be able to update/overwrite these DLL
while the system is running but it appears that after calling System.Reflection.Assembly.LoadFile
the file is subsequently locked.
Does anyone know of a way to unlock the file?
I have read about loading the file in a separate appdomain? Are there any pitfalls to this approach?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
If you use this:
System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes(path))
It will not lock the file.
Edit
While this works, it is not the best solution, but the better way of doing it is a lot more involved (too much for just pasting all the code here for it).
I have created a public repository on Github here with all the code for doing this properly:
Loading Assemblies without Locking by using Shadow Copying.
Method 2
Use Microsoft.Cci included in Microsoft FxCop
Sample for version 1.35:
using Microsoft.Cci; // [...] AssemblyNode assembly = AssemblyNode.GetAssembly(path);
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0