【问题标题】:System.Reflection.Assembly.LoadFile Locks FileSystem.Reflection.Assembly.LoadFile 锁定文件
【发布时间】:2009-06-23 08:59:10
【问题描述】:

我正在通过System.Reflection.Assembly.LoadFile 加载DLL,并在插件式系统中反映它的成员。 我需要能够在系统运行时更新/覆盖这些DLL,但似乎在调用System.Reflection.Assembly.LoadFile 之后文件随后被锁定。
有谁知道解锁文件的方法吗?
我已阅读有关在单独的应用程序域中加载文件的信息?这种方法有什么缺陷吗?

【问题讨论】:

    标签: asp.net reflection plugins


    【解决方案1】:

    如果你使用这个:

     System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes(path))
    

    它不会锁定文件。

    编辑


    虽然这可行,但它不是最好的解决方案,但更好的方法涉及更多(仅将所有代码粘贴到这里就太多了)。

    我在 Github 上创建了一个公共存储库,其中包含正确执行此操作的所有代码:

    Loading Assemblies without Locking by using Shadow Copying.

    【讨论】:

    • 效果很好!我将保持开放状态只是为了看看是否有人涵盖其他一些要点......
    • 很高兴它对你有用 :) 我从未尝试过 AppDomain 方法,尽管我在寻找解决这个问题的方法时确实阅读了一些内容。
    • 这种方法的缺点可能是您无法从内存中“卸载”程序集,这意味着每次更新 DLL 并重新加载时,您最终都会在内存中获得另一个副本。 AppDomain 方法更谨慎一些,并且有(轻微?)性能下降,但这确实意味着您可以在不再需要时卸载 AppDomain。
    • 这使我免于错过最后期限。非常感谢!
    • 这仅适用于独立库。如果 path 处的 dll 有子依赖,则程序集加载器将无法解析它们。
    【解决方案2】:

    使用 Microsoft FxCop 中包含的 Microsoft.Cci

    1.35 版示例:

    using Microsoft.Cci;
    // [...]
    AssemblyNode assembly = AssemblyNode.GetAssembly(path);
    

    【讨论】:

      猜你喜欢
      • 2021-03-29
      • 2015-04-14
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多