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

Num*_*nif 6 .net c# dll

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

  1. Shadowcopy:在这种情况下,当我影子复制程序集然后在那之后,如果我在
    我的主dll中更改了某些东西,它在我的加载应用程序中仍然是旧的.

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

  3. System.Reflection.assembly.ReflectionOnlyConext(); //不起作用

有没有适当的解决方案

key*_*rdP 21

一种方法是读取文件的字节并使用Assembly.Load的重载,它接受类似于你在第二个例子中所做的字节数组.我不确定是什么System.IO.GetBytes,只是尝试一下File.ReadAllBytes.

byte[] assemblyBytes = File.ReadAllBytes("asm-path");
var assembly = Assembly.Load(assemblyBytes);
Run Code Online (Sandbox Code Playgroud)

但是,根据您要执行的操作,这可能还不够,因为在装载后无法卸载装配.要解决此问题,如果需要,可以将程序集加载到自己的AppDomain中,然后在完成后卸载AppDomain.

AppDomain ad = AppDomain.CreateDomain("New_Assembly_AD");
byte[] assemblyBytes = File.ReadAllBytes("asm-path");
var assembly = ad.Load(assemblyBytes);  
Run Code Online (Sandbox Code Playgroud)

完成assembly对象后,可以卸载AppDomain.

AppDomain.Unload(ad);
Run Code Online (Sandbox Code Playgroud)

  • 新的 appdomain 是唯一合理的方法...请注意,也必须在新的 AppDomain 中进行反射,以避免将类型泄漏到原始域中(这也会将程序集加载到原始域中,而所有努力都白费了)。 (2认同)