我们正在开发一个有大量插件dll文件的web应用程序。
现在,我们能够加载我们需要的所有程序集,但我们在执行此操作时使用了BuildManager.AddReferencedAssembly。这--我猜--造成了一个小问题。
问题是,我们需要在不重新启动应用程序的情况下更新这些dll文件,但这些dll文件在应用程序运行时被锁定。
我们没有对这些dll文件使用bin文件夹。我们使用了两个不同的文件夹(第一个-- ~/plugins --我们用来复制文件,第二个-- ~/ptemp - folder是用来复制plugins文件夹下的文件,然后加载到应用程序中,就像bin文件夹中的文件一样)
如您所知,当应用程序运行时,您可以覆盖bin文件夹中的文件,因此这意味着可以在应用程序运行时覆盖项目程序集。
经过一些研究,我发现在appdomainsetup中使用私有文件夹是可能的,但我不知道怎么做。(我们不想创建另一个appdomain,我们希望这些位于ptemp文件夹中的文件被附加到主域中)
很抱歉我的英语很差,但是如果你可以的话,请帮助我们。
顺便说一下,其中一些dll文件包含一些mvc区域。
我们使用的是MVC4.5,.Net 4。
如果有必要,我可以发布一些代码。
发布于 2014-09-30 05:38:09
看起来最好的方法就是重启应用程序
发布于 2016-03-19 22:05:04
下面是我们正在做的事情:
var shadowCopyDirectories = AppDomain.CurrentDomain.SetupInformation.ShadowCopyDirectories;
var newShadowCopyDirectories = shadowCopyDirectories
+ System.IO.Path.PathSeparator
+ HostingEnvironment.MapPath("~/App_Data/DynamicAssemblies/");
#pragma warning disable 618
// Disabled compiler warning
AppDomain.CurrentDomain.SetShadowCopyPath(newShadowCopyDirectories);
#pragma warning restore 618基本启用将给定目录中的程序集的卷影复制到临时ASP.NET文件,这意味着这些程序集不会被锁定。我试着找到一种不过时的方法来做这件事,但在搜索了大约30分钟后,我一无所获,没有时间进一步搜索。
但是,您仍然无法避免应用程序重启,因为:
1)你不能从当前运行的应用程序中卸载“旧的”程序集,这意味着你将在内存中留下垃圾,并且可能会因为加载了同一个程序集的两个版本(e.x.类型A源自程序集1,而类型B源于程序集B)
2)您需要一种方法来告诉BuildManager重新编译所有内容
但最终,你最好启用卷影复制,因为在回收时,可能会产生第二个工作进程,而第一个工作进程会等待第二个工作进程准备就绪,在这种情况下,直到完全停止应用程序池,你才能更新这些“动态”程序集。
https://stackoverflow.com/questions/17425641
复制相似问题