2014-01-29 38 views
1

我的情况是;C#避免文件锁定Assembly.Load

我正在设计一个插件应用程序,基于动态加载插件程序集,多个用户可以运行托管在服务器机器上的应用程序。应用程序是在启动时从我的实时更新服务器自动更新插件程序集。所以插件文件(及其附属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是一个静态参考DLL既PL1和PL2的插件,通过PL1和PL2的AppDomain加载

PL1_S和PL_COMMON应该也不会被锁定在像PL1和PL2组件

如何解决任何想法文件?

+0

如果你正在寻找的“插件”,你已经看到以托管加载框架(MAF)的概念?检查http://channel9.msdn.com/Blogs/DanielMoth/Managed-AddIn-Framework –

+1

该规则非常简单:如果程序集加载到* any * AppDomain中,程序集文件将被锁定。不得不调整你的需求,因为你不能想出一种方法来销毁AppDomain,这是预期的结果。 –

回答

4

已经有内置功能来做到这一点,例如, ASP.Net。见Shadow Copying Assemblies

影子复制使得能够在应用程序中使用的域被更新而不卸载应用程序域集。这对于必须持续使用的应用程序特别有用,例如ASP.NET网站。

所以刚才创建的时候把那经由AppDomainSetup.ShadowCopyFilesAppDomain小号