C#在Assembly.Load时避免文件锁定

时间:2014-01-29 15:20:13

标签: c# dll .net-assembly filelock

我的情况是;

我正在设计一个插件应用程序,基于动态加载插件程序集,多个用户可以运行托管在服务器计算机上的应用程序。应用程序在启动时从我的实时更新服务器自动更新插件程序集。所以插件文件(及其卫星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程序集一样锁定在文件中

如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

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

  

卷影复制可以在不卸载应用程序域的情况下更新应用程序域中使用的程序集。这对于必须连续可用的应用程序尤其有用,例如ASP.NET站点。

因此,在创建AppDomain

时,请通过AppDomainSetup.ShadowCopyFiles启用此功能