【问题标题】:C# Avoid file lock when Assembly.LoadC#在Assembly.Load时避免文件锁定
【发布时间】:2014-01-29 15:20:12
【问题描述】:

我的情况是;

我正在设计一个插件应用程序,基于动态加载插件程序集,多个用户可以运行托管在服务器计算机上的应用程序。应用程序在启动时从我的实时更新服务器自动更新插件程序集。所以插件文件(及其附属 dll 不应该被锁定在文件系统上。

 byte[] assemblyBytes = File.ReadAllBytes("asm-path");
 var assembly = Assembly.Load(assemblyBytes);

正如预期的那样,没有锁定 dll 文件。但是如果我加载的 dll 本身有静态引用 dll 怎么办?它们现在被锁定在文件系统上。

给文件命名,比如说;

  • APP.Exe 是我的基础应用程序;
  • PL1.dll 是我的第一个插件,APP.exe 将其加载到新的 Appdomain 中
  • PL2.dll 是我的第二个插件,APP.exe 将其加载到新的 Appdomain 中
  • PL1_S.dll 是 PL1.dll 插件的静态引用 dll,加载在 PL1 AppDomain 中
  • PL_COMMON 是 PL1 和 PL2 插件的静态引用 dll,由 PL1 和 PL2 AppDomains 加载

PL1_S 和 PL_COMMON 也不应该像 PL1 和 PL2 程序集一样锁定在文件中

知道如何解决这个问题吗?

【问题讨论】:

  • 如果您正在寻找“插件”的概念,您是否已经看过托管插件框架 (MAF)?检查channel9.msdn.com/Blogs/DanielMoth/Managed-AddIn-Framework
  • 规则非常简单:如果在any AppDomain 中加载程序集,程序集文件将被锁定。由于无法想出一种方法来销毁 AppDomain,因此不得不调整您的要求是预期的结果。

标签: c# dll .net-assembly filelock


【解决方案1】:

已经内置了执行此操作的功能,例如ASP.NET。见Shadow Copying Assemblies

影子复制允许在不卸载应用程序域的情况下更新应用程序域中使用的程序集。这对于必须持续可用的应用程序(例如 ASP.NET 站点)特别有用。

因此,只需在创建 AppDomains 时通过 AppDomainSetup.ShadowCopyFiles 将其打开

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-16
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2013-09-13
    相关资源
    最近更新 更多