2011-01-10 136 views
12

我被要求看看ASP/C#应用程序中的一个错误与贝宝集成。误差,完全示出,为:无法加载文件或程序集log4net或它的一个依赖

无法加载文件或组件 'log4net的,版本= 1.2.0.30714, 文化=中性 公钥= b32731d11ce58905' 其依赖的或 之一。位于 程序集清单定义 与程序集引用不匹配。 (异常来自HRESULT:0x80131040)

据我所知,这意味着位于实际的文件(也就是,在我的bin目录log4net.dll)不匹配基于一些组合配置预计的版本。我遇到的问题是我无法找到该文件被引用的位置。

我可以访问所有文件在网站的Web根目录下,并不能找到引用此DLL的任何配置文件。我还需要考虑哪些方面来确定造成错配的原因?

作为一个说明,我确信,在bin目录中的DLL的版本是最新的,但是这似乎并没有已经解决任何事情。

回答

9

你需要控制在项目引用内容以及 - 引用被编译成汇编本身并尝试加载。我的猜测是,您有一个过时的log4net程序集引用,但正在使用最新版本。

+0

这很有道理。有没有办法让我看看在项目中做了哪些引用 - 查看编译后的项目时通常会找到哪个文件? – Elie 2011-01-10 01:12:55

+0

您不应该看编译的项目,而是未编译的项目 - csproj文件。否则,我认为depend.exe(在Mark的帖子中)会有所帮助。 – Femaref 2011-01-10 01:32:05

+0

这也可以在nuget包中验证。如果其中一个项目引用了log4net 1.2.3版。4和其他项目寻找log4net版本5.6.7.8,那么你会得到这个错误。 (或任何其他nuget包)。只要匹配这些版本,你就可以走了。 – Krishna 2017-07-13 22:51:41

1

我没有任何有关特定错误的有用信息。但是,如果您没有使用它们,有几个有用的实用程序可帮助解决此类问题:Dependency Walker.NET Reflector

的依赖性检查器可用于查看是否存在由log4net的组件中使用意想不到模块。 Reflector实用程序显示有关程序集的各种有用信息(包括版本,引用程序集,更不用说反汇编代码)。

2

你可能拥有最新版本的log4net的,但所具有的选择引用旧的项目。您可以强制所有组件引用旧版本使用<bindingRedirect>

您可以找到有关他们在这里更多信息以参考新版本:http://msdn.microsoft.com/en-us/library/eftw1fys.aspx

如果你不知道具体的版本重定向,你可以也使用一系列版本并将它们全部指向您的特定版本。

1

我也遇到了这个问题,它发生的原因是项目,由于某种原因,从GAC拉log4net,所以很可能GAC中的版本与引用的版本不匹配在您的项目

14

我们也有这个问题的时候,我们搬到了VS 2010和.NET 4.0中,我们不使用log4net的所有,但我怀疑别的东西,我们使用它(也许水晶报表?),我也怀疑有一个我们使用的DLL也是一个32位的DLL,因为当我将IIS中的应用程序池的高级设置下的“启用32位应用程序”选项更改为“True”时,所有工作都会重新开始。

4

我们的网络应用程序有类似的问题。我们从古老的.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应用程序项目的引用,重新编译,然后重新打开用户控件,错误消失。

log4net download

希望这有助于

0

我要跟着马特的建议启用IIS的应用程序池设置32位应用程序。

原来我甚至都不需要那么远,只要我从卡西尼切换到IIS,错误就解决了。

要切换到IIS:

  1. 启用IIS在Windows程序和功能(请务必也使 “ASP.NET XX” 下的IIS节点>万维网服务>应用程序开发功能)
  2. 在项目属性> Web>使用本地IIS Web服务器>创建虚拟目录(必须以管理员身份运行VS来执行此操作)。
  3. 构建项目>在此之后运行

没有log4net的错误。

我不知道为什么我得到它,因为我什至不使用log4net,但我很高兴它消失了。

2

同样的错误在这里,这里是我们如何修复:从Apache下载最新的.Net 4.0 log4net.dll,并替换bin文件夹中的版本为我工作。您应该添加对您的项目的引用以使其永久。这里是链接:Apache

转到下载,二进制文件,然后选择新的密钥版本。下载完成后,导航到.Net 4.0文件夹以查找.dll文件。

0

阅读这些答案后,我结束了检查.csproj并找到实际参考'Lib \ log4net.dll'的部分。我删除了这个项目并编译。

相关问题