We use an assembly.loadfrom call to load the types of the assembly, which locks the dll indeed. we can't use 'for reflection only' as we have to make instances of the types at times.
We do have a workitem for creating a shadowcopy of the dll before reflection but it hasn't been implemented yet, so it's not defined when it will come. shadowcopy isn't that simple as the dll in question might reference other dlls in the same folder so we have to copy all dlls in the folder before the probing starts, which can be a lot. We can't use shadowcopy as implemented in the .NET CLR as that has limitations on where the dlls are located and startup time, so we have to implement it manually.