无法加载文件或程序集log4net或它的一个依赖
我被要求看看ASP/C#应用程序中的一个错误与贝宝集成。误差,完全示出,为:无法加载文件或程序集log4net或它的一个依赖
无法加载文件或组件 'log4net的,版本= 1.2.0.30714, 文化=中性 公钥= b32731d11ce58905' 其依赖的或 之一。位于 程序集清单定义 与程序集引用不匹配。 (异常来自HRESULT:0x80131040)
据我所知,这意味着位于实际的文件(也就是,在我的bin目录log4net.dll)不匹配基于一些组合配置预计的版本。我遇到的问题是我无法找到该文件被引用的位置。
我可以访问所有文件在网站的Web根目录下,并不能找到引用此DLL的任何配置文件。我还需要考虑哪些方面来确定造成错配的原因?
作为一个说明,我确信,在bin目录中的DLL的版本是最新的,但是这似乎并没有已经解决任何事情。
你需要控制在项目引用内容以及 - 引用被编译成汇编本身并尝试加载。我的猜测是,您有一个过时的log4net程序集引用,但正在使用最新版本。
我没有任何有关特定错误的有用信息。但是,如果您没有使用它们,有几个有用的实用程序可帮助解决此类问题:Dependency Walker和.NET Reflector。
的依赖性检查器可用于查看是否存在由log4net的组件中使用意想不到模块。 Reflector实用程序显示有关程序集的各种有用信息(包括版本,引用程序集,更不用说反汇编代码)。
你可能拥有最新版本的log4net的,但所具有的选择引用旧的项目。您可以强制所有组件引用旧版本使用<bindingRedirect>
您可以找到有关他们在这里更多信息以参考新版本:http://msdn.microsoft.com/en-us/library/eftw1fys.aspx
如果你不知道具体的版本重定向,你可以也使用一系列版本并将它们全部指向您的特定版本。
我也遇到了这个问题,它发生的原因是项目,由于某种原因,从GAC拉log4net,所以很可能GAC中的版本与引用的版本不匹配在您的项目
我们也有这个问题的时候,我们搬到了VS 2010和.NET 4.0中,我们不使用log4net的所有,但我怀疑别的东西,我们使用它(也许水晶报表?),我也怀疑有一个我们使用的DLL也是一个32位的DLL,因为当我将IIS中的应用程序池的高级设置下的“启用32位应用程序”选项更改为“True”时,所有工作都会重新开始。
我们的网络应用程序有类似的问题。我们从古老的.NET 1.1 32位升级到.NET 4.0 64位。
我在我们的我们的用户控件的一个接收错误是如下:
ASP.NET runtime error: Could not load file or assembly 'log4net' or one of its dependencies. An attempt was made to load a program with an incorrect format.
在这里,我的猜测是,我们在编写64位DLL中,但其引用一个32位DLL ?我同意Matt Palmerlee上面所说的 - 将应用程序池切换到32位模式确定问题,但仍然卡在32位应用程序池中。我们想要利用额外的64位内存将提供我们的IIS应用程序池。
最终,我无法确定哪个第三方DLL实际上引用了log4net。我建立后注意到,虽然log4net.dll被复制到我的“bin”目录,我右键单击它,并找出它与Apache基金会有关 - http://logging.apache.org/log4net/
我结束了刚刚下载最新的log4net.dll对于.NET 4,将其添加为我的Web应用程序项目的引用,重新编译,然后重新打开用户控件,错误消失。
希望这有助于
我要跟着马特的建议启用IIS的应用程序池设置32位应用程序。
原来我甚至都不需要那么远,只要我从卡西尼切换到IIS,错误就解决了。
要切换到IIS:
- 启用IIS在Windows程序和功能(请务必也使 “ASP.NET XX” 下的IIS节点>万维网服务>应用程序开发功能)
- 在项目属性> Web>使用本地IIS Web服务器>创建虚拟目录(必须以管理员身份运行VS来执行此操作)。
- 构建项目>在此之后运行 我
没有log4net的错误。
我不知道为什么我得到它,因为我什至不使用log4net,但我很高兴它消失了。
同样的错误在这里,这里是我们如何修复:从Apache下载最新的.Net 4.0 log4net.dll,并替换bin文件夹中的版本为我工作。您应该添加对您的项目的引用以使其永久。这里是链接:Apache
转到下载,二进制文件,然后选择新的密钥版本。下载完成后,导航到.Net 4.0文件夹以查找.dll文件。
阅读这些答案后,我结束了检查.csproj并找到实际参考'Lib \ log4net.dll'的部分。我删除了这个项目并编译。
这很有道理。有没有办法让我看看在项目中做了哪些引用 - 查看编译后的项目时通常会找到哪个文件? – Elie 2011-01-10 01:12:55
您不应该看编译的项目,而是未编译的项目 - csproj文件。否则,我认为depend.exe(在Mark的帖子中)会有所帮助。 – Femaref 2011-01-10 01:32:05
这也可以在nuget包中验证。如果其中一个项目引用了log4net 1.2.3版。4和其他项目寻找log4net版本5.6.7.8,那么你会得到这个错误。 (或任何其他nuget包)。只要匹配这些版本,你就可以走了。 – Krishna 2017-07-13 22:51:41