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

C# 在.net中加载dll而不锁定它,c#,.net,dll,C#,.net,Dll,我正在处理一个任务,在这个任务中,我必须加载dll并从中获取一些信息,如类名等。。。但当我把那个dll加载到我的代码中时,它会被锁定,在我关闭加载程序之前无法从源代码中构建。我尝试过某种解决方案,但它们都不适合我 卷影复制:在这种情况下,如果我在 我的主dll在我的加载应用程序中仍然是旧的 System.Reflection.assembly.loadfrom(System.IO.GetBytes(“asm路径”)//有时工作,但不总是 System.Reflection.assembly.Re

我正在处理一个任务,在这个任务中,我必须加载dll并从中获取一些信息,如类名等。。。但当我把那个dll加载到我的代码中时,它会被锁定,在我关闭加载程序之前无法从源代码中构建。我尝试过某种解决方案,但它们都不适合我

  • 卷影复制:在这种情况下,如果我在
    我的主dll在我的加载应用程序中仍然是旧的

  • System.Reflection.assembly.loadfrom(System.IO.GetBytes(“asm路径”)//有时工作,但不总是

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


  • 是否有任何适当的解决方案

    可能只是在检查信息后尝试释放该文件? 这样,它可能只会被锁定几毫秒

    如果这不起作用。复制dll并使用副本


    如果希望在dll更改时刷新信息,则可以编写目录侦听器,并在原始dll更新时执行某些操作。

    一种方法是读取文件的字节,并使用Assembly.Load重载,该重载将采用与第二个示例中类似的字节数组。我不确定
    System.IO.GetBytes
    是什么,但请尝试
    File.ReadAllBytes

    byte[] assemblyBytes = File.ReadAllBytes("asm-path");
    var assembly = Assembly.Load(assemblyBytes);
    
    但是,这可能还不够,这取决于您要执行的操作,因为在加载程序集后无法卸载该程序集。为了解决这个问题,如果需要,可以将程序集加载到自己的程序集中,然后在完成AppDomain后卸载它

    AppDomain ad = AppDomain.CreateDomain("New_Assembly_AD");
    byte[] assemblyBytes = File.ReadAllBytes("asm-path");
    var assembly = ad.Load(assemblyBytes);  
    
    完成
    程序集
    对象后,可以卸载AppDomain

    AppDomain.Unload(ad);
    

    Assembly.LoadFrom()没有接受字节[]的重载,并且System.IO中肯定没有名为GetBytes()的方法。相当草率的研究。Load(字节[])肯定不能锁定文件。不要使用它。带卷影副本的AppDomains是正确完成此任务的唯一方法。新建appdomain是唯一明智的方法。。。请注意,反射也必须在新的AppDomain中进行,以避免将类型泄漏到原始域中(这也会将程序集加载到原始域中,并且会浪费所有的精力)。@AlexeiLevenkov-很好的调用,明确提到应该在新的AppDomain中进行工作,谢谢。@AlexeiLevenkov请提供一些代码示例[注意,反射也必须在新的AppDomain中进行,以避免将类型泄漏到原始域]@RoyaanKhan-like