在.net中加载dll而不锁定它

我正在处理一个任务,我必须加载DLL并从类名称等获取一些信息…但是当我将该DLL加载到我的代码中时,它被锁定并且无法从源代码构建,直到我关闭加载程序,我已经尝试了某些解决方案,但它们都不适合我

  1. Shadowcopy:在这种情况下,当我影子复制组件然后在那之后,如果我已经改变了一些东西
    我的主要dll在我的加载应用程序中仍然是旧的。

  2. System.Reflection.assembly.loadfrom(System.IO.GetBytes( “ASM-路径”)); //有时工作,但并不总是

  3. 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更新时执行某些操作。