我有一个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
文件夹中。
答案 0 :(得分:0)
我不太记得我找到哪个帖子引导我解决此问题,但实际上在probing
的{{1}}部分中添加了assemblyBinding
元素对我来说就是解决此问题的方法
Web.Config
我必须添加要包含的每个DLL的根文件夹,因为我不知道如何获取它以递归方式遍历目录。