2

我们正在开发一个包含大量插件 dll 文件的 Web 应用程序。

现在,我们可以加载我们需要的所有程序集,但我们在执行此操作时使用的是 BuildManager.AddReferencedAssembly。这 - 我猜 - 会导致一个小问题。

问题是,我们需要在不重新启动应用程序的情况下更新这些 dll 文件,但这些 dll 文件在应用程序运行时被锁定。

我们没有为这些 dll 文件使用 bin 文件夹。我们正在使用 2 个不同的文件夹(第一个 - ~/plugins - 用于我们复制文件,第二个 - ~/ptemp - 文件夹用于复制位于 plugins 文件夹下的文件,然后像 bin 文件夹中的文件一样加载到应用程序中)

如您所知,在应用程序运行时,您可以覆盖 bin 文件夹中的文件,这意味着可以在应用程序运行时覆盖项目程序集。

经过一些研究,我发现可以通过在 appdomainsetup 中使用私有文件夹的东西,但无法弄清楚如何。(我们不想创建另一个 appdomain,我们希望将这些位于 ptemp 文件夹中的文件附加到主域)

对不起,我的英语很差,但如果可以,请帮助我们。

顺便说一句,其中一些 dll 文件包含一些 mvc 区域。

我们正在使用 .Net 4.5、Mvc 4。

如果有必要,我可以发布一些代码。

4

2 回答 2

1

这是我们正在做的事情:

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)您不能从当前运行的应用程序中卸载“旧”程序集,这意味着您将在内存中留下垃圾,并且通过加载同一程序集的两个版本(例如 A 型起源)可能面临一种 dll 地狱来自装配 1,而 B 型来自装配 B)

2)您需要一种方法来告诉 BuildManager 重新编译所有内容

但最后你可能最好启用卷影复制,因为在回收时,可能会产生第二个工作进程,而第一个工作进程会等待第二个工作进程准备好,在这种情况下,你将无法更新那些“动态”程序集,直到你完全停止了你的应用程序池。

于 2016-03-19T14:05:03.830 回答
-2

似乎最好的方法是重新启动应用程序

于 2014-09-29T21:38:08.973 回答