无法加载文件或程序集log4net或其依赖项之一

13
我被要求查看一个ASP/C#应用程序与Paypal集成的错误。完整显示的错误如下:无法加载文件或程序集'log4net,Version = 1.2.0.30714,Culture = neutral,PublicKeyToken = b32731d11ce58905'之一及其相关依赖关系。所定位的程序集清单定义与程序集引用不匹配。(HRESULT异常:0x80131040)。
据我所知,这意味着实际定位的文件(即我的bin目录中的log4net.dll)与某些程序集配置所期望的版本不匹配。我的问题是我找不到引用该文件的位置。
我可以访问站点Web根目录中的所有文件,并且找不到任何引用此DLL的配置文件。在哪里可以查询以确定什么导致了不匹配?
请注意,我已确保bin目录中的DLL版本是最新的,但似乎没有解决任何问题。
9个回答

16

我们在迁移到VS 2010和.NET 4.0时也遇到了这个问题。我们并没有使用log4net,但我怀疑我们使用的其他东西可能会引用它(也许是Crystal Reports?)而且我还怀疑我们使用了一个32位dll,因为当我把IIS应用程序池的高级设置下的“启用32位应用程序”选项改为“True”时,一切都正常工作了。


对我来说,这绝对是由于Crystal Reports。 - basher
很有趣。这也发生在我身上——要求参考,而我的解决方案根本没有使用它。我的“有效”解决方案只是重新启动了VS2017。我确切地知道之前加载的项目使用了log4net。但当前项目完全没有使用。似乎它们共享一些临时文件或其他东西,导致冲突。 - Saulius
需要log4net的是Crystal Reports,你可以在这里下载CR,不过需要进行快速注册。https://www.sap.com/cmp/td/sap-crystal-reports-visual-studio-trial.html - Dung

11

您还需要控制项目中的引用 - 引用被编译到程序集本身中,并将尝试加载。我猜您对log4net程序集有一个过时的引用,但使用的是最新版本。


有道理。我能否查看项目中正在引用哪个参考 - 当查看已编译的项目时,通常会在哪个文件中找到它? - Elie
你不应该只看编译后的项目,而是要看未编译的csproj文件。否则,我认为Mark帖子中提到的depends.exe会有所帮助。 - Femaref
这也可以在NuGet包中进行验证。如果您的其中一个项目引用了log4net版本1.2.3.4,而其他项目正在寻找log4net版本5.6.7.8(或任何其他NuGet包),则会出现此错误。只需匹配这些版本,您就可以继续使用了。 - fluidguid

4
我们的Web应用程序也出现了类似的问题。 我们从古老的.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。不过我注意到构建后,在我的“bin”目录中复制了一个log4net.dll,并右键单击它,发现它与Apache Foundation相关 - http://logging.apache.org/log4net/ 最终我只是下载了最新的.NET 4 log4net.dll,将其添加为我的Web应用程序项目的引用,重新编译,然后重新打开用户控件,错误就消失了。 log4net下载 希望这可以帮助到你。

我遇到了同样的问题...它是从GAC引用log4net,所以你的评论帮助我解决了它...谢谢。 - Munawar

2
这里也发生了同样的错误,我们是这样解决的:从Apache下载最新的.NET 4.0 log4net.dll,并替换bin文件夹中的版本。您应该将其添加到项目引用中以使其永久化。以下是链接:Apache。前往下载页面,选择Binaries并选择新的密钥版本。下载后,转到.NET 4.0文件夹查找.dll文件即可。

2
你可能已经安装了最新版本的log4net,但是项目引用了旧版本。你可以使用<bindingRedirect>来强制所有引用旧版本的程序集引用新版本。
你可以在这里找到更多信息:http://msdn.microsoft.com/en-us/library/eftw1fys.aspx 如果你不知道要重定向的具体版本,你也可以使用一系列版本并将它们全部指向你的特定版本。

1

我没有关于这个具体错误的有用信息。但是,如果您还没有使用过它们,一些有用的工具可以帮助解决这类问题,例如Dependency Walker.NET Reflector

依赖项检查器可用于查看log4net程序集使用的意外模块。而Reflector实用程序显示有关程序集的各种有用信息(包括版本、引用的程序集,更不用说反汇编代码了)。


1

我也遇到了这个问题,原因是项目以某种方式从GAC中提取了log4net,所以很可能GAC中的版本与您项目中引用的版本不匹配。


0
阅读了这些答案后,我最终检查了.csproj文件,并在部分找到了对'Lib\log4net.dll'的实际引用。我将其删除后,项目成功编译。

0

我本来打算按照Matt的建议,在IIS的应用程序池设置中启用32位应用程序。

结果事实证明,我甚至不需要走那么远,只要从Cassini切换到IIS,错误就解决了。

切换到IIS:

  1. 在Windows Programs and Features中启用IIS(确保还在IIS > World Wide Web Services > Application Development Features下启用“ASP.NET x.x”节点)
  2. 在项目属性中>Web>使用本地IIS Web服务器>创建虚拟目录(必须以管理员身份运行VS才能执行此操作)。
  3. 构建项目>运行

这之后,我没有log4net错误。

我不知道为什么会出现这种情况,因为我根本没有在任何地方使用log4net,但我很高兴它已经消失了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接