即使已经动态加载了MVC,登录页面也找不到DLL

时间:2019-05-13 01:45:16

标签: c# asp.net-mvc dll plugins

我有一个MVC登录页面,我试图使用一些已经为其他目的创建的.DLL。这些.DLL实际上是插件,它们位于我网页的/CorePlugins文件夹中,并在运行时通过 PreApplicationStartMethod 动态加载。这是我如何加载这些.DLL的方法:

var corePluginAssemblyFiles = CorePluginsFolder.GetFiles("*.dll", SearchOption.AllDirectories);

foreach (var assemblyFile in corePluginAssemblyFiles)
{
    var assembly = Assembly.LoadFile(assemblyFile.FullName);
    System.Web.Compilation.BuildManager.AddReferencedAssembly(assembly);
}

现在,在这些插件中,我实际上可以来回引用我想要的任何方式,并且一切正常。但是,当尝试从我的登录页面 LoginController (位于/ bin文件夹而不是/ CorePlugins文件夹中的)中使用一个时,它说找不到.Dll有问题:

  

无法加载文件或程序集“ Core.API.UserMgmt,版本= 1.0.0.0,区域性=中性,PublicKeyToken =空”或其依赖项之一。找不到网络路径。   说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。

     

异常详细信息:System.IO.FileNotFoundException:无法加载文件或程序集“ Core.API.UserMgmt,版本= 1.0.0.0,区域性=中性,PublicKeyToken =空”或其依赖项之一。找不到网络路径。

     

源文件:C:\ svn \ HomeCenter_DEV \ HomeCenter \ HomeCenter.Core \ Controllers \ LoginController.cs行:202

     

程序集加载跟踪:以下信息有助于确定为何无法加载程序集“ Core.API.UserMgmt,版本= 1.0.0.0,文化=中性,PublicKeyToken =空”。

     

===预绑定状态信息===

     

日志:DisplayName = Core.API.UserMgmt,版本= 1.0.0.0,区域性=中性,PublicKeyToken =空    (完全指定)

     

日志:Appbase = file:/// C:/svn/HomeCenter_DEV/HomeCenter/HomeCenter.Core/

     

日志:初始PrivatePath = NULL

     

调用程序集:HomeCenter.Core,版本= 1.0.0.0,文化=中性,PublicKeyToken =空。

     

===

     

LOG:此绑定在默认的加载上下文中启动。

     

日志:使用应用程序配置文件:C:\ svn \ HomeCenter_DEV \ HomeCenter \ HomeCenter.Core \ web.config

     

日志:使用主机配置文件:C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet.config

     

日志:使用C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.config中的计算机配置文件。

     

日志:目前未将策略应用于引用(私有,自定义,部分或基于位置的程序集绑定)。

     

LOG:之前看到过相同的绑定,但由于hr = 0x80070035而失败。

因此,只是为了咯咯地笑,我也将.DLL的副本放置在/ bin文件夹中,并且低一点,以为它无法加载该程序集,因为它已经加载了。所以现在我在想什么。因此,我使用一些测试代码从 System.Web.Compilation.BuildManager.GetReferencedAssemblies() AppDomain.CurrentDomain.GetAssemblies()中打印了加载的程序集,实际上,请参见我正在尝试使用Core.API.UserMgmt, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null的.DLL。那么这是怎么回事?为什么找不到明显已经加载的DLL。如果我将.dll放在/ bin文件夹中并将其从/CorePlugins文件夹中删除,则它可以工作,但是随后我建立的所有其他程序都中断了。我需要.dll位于/CorePlugins文件夹中。

1 个答案:

答案 0 :(得分:0)

我不太记得我找到哪个帖子引导我解决此问题,但实际上在probing的{​​{1}}部分中添加了assemblyBinding元素对我来说就是解决此问题的方法

Web.Config

我必须添加要包含的每个DLL的根文件夹,因为我不知道如何获取它以递归方式遍历目录。