【问题标题】:How to avoid using BuildManager.AddReferencedAssembly如何避免使用 BuildManager.AddReferencedAssembly
【发布时间】:2013-07-02 12:27:53
【问题描述】:

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

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

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

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

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

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

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

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

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

如果有需要,我可以贴一些代码。

【问题讨论】:

  • 顺便说一下,我发现文件锁定可能是由 AppDomain.CurrentDomain.AppendPrivatePath(pluginsTempPath);线。无论如何,我们不能覆盖临时插件文件夹中的这些 dll 文件,我们需要这样做。现在,如果不重新启动应用程序,就无法更新 dll。
  • (问题超过 12 个月后发表评论):开始研究在自己的 AppDomains 中加载插件
  • 可以在自己的应用程序域中加载插件,但在应用程序域之间传递数据时会产生序列化/反序列化成本。场景不再是“在本地执行某事”,而是更像是“调用远程服务”。

标签: asp.net-mvc dynamic .net-assembly


【解决方案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 型源自程序集 1,而 B 型源自程序集 B)

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我想是的。因为这些文件也被 mvc 自己消耗掉了。
    • 但这并不能真正回答他的问题。
    猜你喜欢
    • 2011-11-02
    • 2017-07-09
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多