【问题标题】:Error: Could not load log4net assembly错误:无法加载 log4net 程序集
【发布时间】:2025-12-10 09:25:01
【问题描述】:

我正在寻找解决这个错误:

无法加载文件或程序集“log4net,版本=1.2.10.0,Culture=neutral,PublicKeyToken=692fbea5521e1304”或其依赖项之一。系统找不到指定的文件。”此错误位于 web.config 文件中。

当我将 log4net.dll 复制到我的 webapp 的 bin 目录时,我得到一个

无法加载文件或程序集“log4net,版本=1.2.10.0,Culture=neutral,PublicKeyToken=692fbea5521e1304”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。

web.config 文件中也会出现此错误。

更改版本和公钥标记以匹配文件很容易,这样程序集就可以正确加载。当我这样做时,我的网站运行完美,除了 reportViewer 对象被初始化时。然后它会在 reportViewer 标记而不是 web.config 中引发原始错误。

我的假设是,如果我安装了log4net.dll 的请求版本,我的问题就会得到解决。但我不知道它是哪个文件,或者在哪里可以找到它。我通过下载 log4net 1.2.10 并尝试下载中的每个 dll 来检查明显的情况。

我应该提到该网站在我的开发机器上运行没有问题,但在发布到我的服务器时却没有。

我在 Server 2008 R2 操作系统上运行一个 asp.net 网站、.NET 4.0、IIS 7。我已经为 64 位安装了 Crystal Reports 13.0.1(我的机器是 64 位的)。

我该如何解决这个问题?

编辑: 为了回应@Kevian 的回答,我对我的 web.config 文件进行了更改。我仍然收到清单定义与程序集引用不匹配的错误。抛出此错误的代码是:

Line 33:     <CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server"   AutoDataBind="true"
Line 34:         BestFitPage="True" ToolPanelView="None" />

【问题讨论】:

  • 找到解决方案了吗?

标签: c# asp.net crystal-reports


【解决方案1】:

这里有几个可以解决的问题:

  1. 32 位版本 log4net.dll 的公钥标记与 Crystal Reports 使用的公钥标记冲突。要验证您是否遇到此问题,请在所有 .csproj 文件中搜索“692fbea5521e1304” - 如果您看到对 CrystalDecisions 的引用AND log4net 你有这个问题。
  2. 32 位版本的 log4net.dll 与为 64 位或 AnyCPU 架构编译的 dll 发生冲突。如果您遇到此问题,您将找到如下所示的参考。您可以通过将应用程序池重新配置为以 32 位运行并检查应用程序是否运行来验证问题 - 如果运行,则说明您遇到了这个问题。
<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, 

PublicKeyToken=692fbea5521e1304,处理器架构=x86" >

在 64 位中为我们工作的修复是获取最新的 log4net.dll,它实际上有一个新的 PublicKeyToken,替换你的 3rd 方 bin 文件夹中的 log4net.dll,并且将所有 log4net.dll 引用更改为如下所示:

<Reference Include="log4net, Version=1.2.10.0, Culture=neutral,

PublicKeyToken=1b44e1d426115821,处理器架构=MSIL">

【讨论】:

  • 来自 Apache 的 log4net 1.2.10.0 具有公钥令牌“1b44e1d426115821”。 SAP 运行时的 1.2.10.0 版本具有公钥令牌“692fbea5521e1304”。 SAP 提供带有“692fbea5521e1304”令牌的 32 位和 64 位。因此,并不是 32 位和 64 位有区别,而是程序集的签名完全不同。解析强命名程序集时,应用程序在运行时绑定上找不到 SAP 的版本。 OP 表示他们更改了公共令牌以匹配,但 SAP 的 log4net != Apache 的相同版本的 log4net。
【解决方案2】:

尝试将此添加到您的 web.config。它基本上告诉运行时您可以为两个版本加载相同的程序集

  <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="log4net" publicKeyToken="692fbea5521e1304" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-1.2.10.0" newVersion="1.2.10.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>

您需要将 1.2.10.0 替换为您在 bin 文件夹中实际拥有的版本。

【讨论】:

  • 它似乎可以工作,但它似乎并没有重定向所有程序集引用。
  • @notkilroy 你能解释一下吗?你是什​​么意思它不会重定向所有引用?你能给我更新的错误信息吗?
  • 这是一个无法加载文件或程序集 log4net。找到的程序集的清单定义与程序集引用不匹配。但是,错误不是指向我的 web.config 中的代码,而是指向单个页面中的一行。该行是:“
【解决方案3】:

如果您的机器是 64 位并且您安装了 Crystal Report 32 位版本,那么这个错误将会困扰您。在这种情况下,所有必需的程序集都已在 GAC 中正确注册,但仍然显示“无法加载 log4net 程序集...” 出现此错误的原因是您试图在 64 位机器上执行 32 位应用程序。

如果您在服务器端实现报告,IIS 将不允许执行此应用程序。要解决此问题,您必须在 IIS 中启用 32 位应用程序。

步骤如下:

  1. 转到运行应用程序的应用程序池
  2. 右键单击并转到高级设置
  3. 在这里找到“启用 32 位应用程序”并将其设置为 true
  4. 重置 IIS (iisreset)

【讨论】:

    【解决方案4】:

    我的代码中有这个问题。有人使用的其中一个项目存在 Log4Net 版本冲突。他们使用的是 12.2.10,而我使用的是 12.2.13。所以为了解决这个问题,我摆脱了我的参考并找到了他们的参考 dll。我改用它,效果很好。

    要查找参考,Microsoft Visual Studio 具有浏览器功能。您可以使用它来获取dll。要查找 dll,您可以单击项目中的引用,然后单击要查找的引用。在这种情况下,Log4Net。它将显示一个依赖列表,另一个 log4net 应该在所选 Log4Net 附近,并且应该有一些文本显示当前所选 dll 引用的位置。这是您可以找到参考的地方。

    【讨论】:

      【解决方案5】:

      MSDOS

      -- Create a virtual disk
      subst t: C:\Windows\assembly
      
      -- Delete log4net x64 assembly
      del t:\GAC_64\log4net\1.2.10.0__692fbea5521e1304\log4net.dll
      
      -- remove the virtual disk
      subst t: /d
      

      【讨论】:

        【解决方案6】:

        对于您的问题,我建议您在参考文献中删除/删除此 dll 并重新安装,这是在 VS 2013 上正确安装 Log4Net 的方法:

        1) 确保通过以下方式打开 NuGet 包管理器实用程序的 nuget.org 包源:右键单击项目(不是解决方案),然后选择左下角的“Manague NUGet Packages ...”选择“设置”,然后选择“包” Manager”,然后选择“可用包源”下的“包源”,选择“nuget.org”,同时检查“Machine-wid 包源”,然后单击“确定”

        2) 它将带您到管理 NUGet 包,然后在左侧窗格中选择“在线”,然后搜索从 apache log4j 移植的“log4net”,然后安装它。完成后,您会发现它已安装在项目的引用下

        我还附上了截图。

        享受吧!

        【讨论】:

          【解决方案7】:

          【讨论】: