【发布时间】: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