C# 错误:无法加载log4net程序集

C# 错误:无法加载log4net程序集,c#,asp.net,crystal-reports,C#,Asp.net,Crystal Reports,我希望解决此错误: 无法加载文件或程序集“log4net,Version=1.2.10.0,Culture=neutral,PublicKeyToken=692fbea5521e1304”或其依赖项之一。系统找不到指定的文件。“此错误位于web.config文件中 当我将log4net.dll复制到我的webapp的bin目录时,我得到一个 无法加载文件或程序集“log4net,Version=1.2.10.0,Culture=neutral,PublicKeyToken=692fbea5521

我希望解决此错误:

无法加载文件或程序集“log4net,Version=1.2.10.0,Culture=neutral,PublicKeyToken=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来检查显而易见的问题

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

我正在服务器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" />
第33行:

尝试将其添加到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文件夹中的实际版本。

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

  • 32位版本的log4net.dll的公钥令牌与Crystal Reports使用的公钥令牌冲突。若要验证是否存在此问题,请在所有.csproj文件中搜索“692fbea5521e1304”-如果您看到对CrystalDecisionslog4net的引用,则表明您存在此问题
  • 32位版本的log4net.dll与为64位或任意CPU体系结构编译的dll冲突。如果存在此问题,您将找到如下所示的引用。您可以通过将应用程序池重新配置为32位运行并检查应用程序是否运行来验证此问题-如果存在此问题,则有此p问题
  • 在64位中对我们有效的修复方法是获取最新的log4net.dll,它实际上有一个新的PublicKeyToken,替换第三方bin文件夹中的log4net.dll,并将所有log4net.dll引用更改为如下所示:


    从下面的链接下载log4net.dll,并将其放在项目中或exe附近


    我的代码中有这个问题。有人使用的一个项目有Log4Net版本冲突。他们使用的是12.2.10,我使用的是12.2.13。因此,为了解决这个问题,我去掉了我的引用,找到了他们的引用dll。我使用了它,它工作得很好

    若要查找引用,Microsoft Visual Studio具有浏览器功能。您可以使用该功能获取dll。若要查找dll,您可以单击项目中的引用,然后单击要查找的引用。在本例中为Log4Net。它将显示依赖项列表,另一个Log4Net应位于选定的Log4Net附近,并且ld是显示当前所选dll引用位置的一些文本。您可以在此处找到引用。

    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
    

    对于您的问题,我建议您删除/删除参考中的此dll并重新安装,以下是如何在VS 2013上正确安装Log4Net:

    1) 确保通过以下方式打开nuget Packages Manager实用程序的nuget.org包源:右键单击项目(非解决方案),然后选择左下角的“管理nuget包…”选择“设置”,然后选择“包管理器”,然后选择“可用包源”下的“包源”选择“nuget.org”并选中两者单击“确定”按钮“机器wid包源”

    2) 您需要管理NUGet软件包,然后在左侧窗格中选择“Online”,然后搜索“log4net”,它是从apache log4j移植的,然后安装它。完成后,您将在项目中的引用下找到它

    我还附上了截图

    享受吧


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

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

    这方面的步骤是:

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

  • 我下载了这个x86版本,问题就解决了


    它似乎可以工作,但似乎无法重定向所有程序集引用。@notkilroy你能再解释一下吗?你说它无法重定向所有引用是什么意思?你能给我更新的版本吗
    <Reference Include="log4net, Version=1.2.10.0, Culture=neutral,
    
    -- 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