错误:无法加载log4net程序集

Bry*_*nne 13 c# asp.net crystal-reports

我想解决这个错误:

无法加载文件或程序集"log4net的,版本= 1.2.10.0文化=中性公钥= 692fbea5521e1304"或它的一个依赖.系统找不到指定的文件."此错误位于web.config文件中.

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

无法加载文件或程序集'log4net,Version = 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位).

我该如何解决这个问题?

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

Line 33:     <CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server"   AutoDataBind="true"
Line 34:         BestFitPage="True" ToolPanelView="None" />
Run Code Online (Sandbox Code Playgroud)

neo*_*ibe 5

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

  1. 32位版本的log4net.dll的公钥标记与Crystal Reports使用的公钥标记冲突.要验证是否存在此问题,请在所有.csproj文件中搜索" 692fbea5521e1304 " - 如果您看到对CrystalDecisions log4net的引用,则表明您遇到此问题.
  2. 32位版本与的dll log4net.dll冲突被编译为64位或AnyCPU架构.如果您遇到此问题,您将找到如下所示的引用.您可以通过将应用程序池重新配置为以32位运行并检查应用程序是否运行来验证问题 - 如果有,则会出现此问题.
<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, 
Run Code Online (Sandbox Code Playgroud)

PublicKeyToken = 692fbea5521e1304,processorArchitecture = x86 ">

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

<Reference Include="log4net, Version=1.2.10.0, Culture=neutral,
Run Code Online (Sandbox Code Playgroud)

PublicKeyToken = 1b44e1d426115821,processorArchitecture = MSIL ">

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

kay*_*one 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>
Run Code Online (Sandbox Code Playgroud)

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