在.net中加载dll而不锁定它
我正在处理一个任务,我必须加载DLL并从类名称等获取一些信息…但是当我将该DLL加载到我的代码中时,它被锁定并且无法从源代码构建,直到我关闭加载程序,我已经尝试了某些解决方案,但它们都不适合我
-
Shadowcopy:在这种情况下,当我影子复制组件然后在那之后,如果我已经改变了一些东西
我的主要dll在我的加载应用程序中仍然是旧的。 -
System.Reflection.assembly.loadfrom(System.IO.GetBytes( “ASM-路径”)); //有时工作,但并不总是
-
System.Reflection.assembly.ReflectionOnlyConext(); //不起作用
有没有适当的解决方案
一种方法是读取文件的字节并使用Assembly.Load的重载,它接受类似于你在第二个例子中所做的字节数组。 我不确定System.IO.GetBytes
是什么,而是尝试File.ReadAllBytes
。
byte[] assemblyBytes = File.ReadAllBytes("asm-path"); var assembly = Assembly.Load(assemblyBytes);
但是,这可能还不够,具体取决于您要执行的操作,因为在装载后无法卸载assembly。 要解决此问题,如果需要,可以将程序集加载到自己的AppDomain中 ,然后在完成后卸载AppDomain。
AppDomain ad = AppDomain.CreateDomain("New_Assembly_AD"); byte[] assemblyBytes = File.ReadAllBytes("asm-path"); var assembly = ad.Load(assemblyBytes);
完成assembly
对象后,可以卸载AppDomain。
AppDomain.Unload(ad);
也许只是在您检查信息后尝试发布文件? 这样它可能仅锁定几毫秒。
如果这不起作用。 复制dll并使用副本…
如果要在dll更改时刷新信息,可以编写目录侦听器,并在原始dll更新时执行某些操作。