C# 项目,编译器提示缺少对 log4net 的引用

标签 c# visual-studio nuget log4net

我正在使用 Visual Studio 2017 构建一个大型 C# 项目(解决方案中有 200 多个项目)。在编译其中一个项目时,出现了很多错误,如下所示:

error CS0012: The type 'BufferingAppenderSkeleton' is defined in an assembly that is not referenced. You must add a reference to assembly 'log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=1b44e1d426115821'.

但是,有问题的项目确实引用了 log4net 1.2.11。唯一可疑的是在log4net的包路径中发现net40-full:“C:\XXXX\Src\packages\log4net.1.2.11\lib\net40-full\log4net .dll"

在项目的 package.config 中,它包含这一行:

<package id="log4net" version="1.2.11" targetFramework="net461" />

在它的 app.config 中,它包含这一行:

      <dependentAssembly>
    <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-1.2.11.0" newVersion="1.2.11.0"/>
  </dependentAssembly>

请问是不是.net版本(4.0 vs. 4.61)不匹配导致的编译错误?

C# 不是我的主要专业领域,但我的理解是 nuget 会查看这些配置文件以下载所需的包,在本例中为 log4net。那怎么下载的是4.0版本而不是4.6.1呢?

最佳答案

my understanding is that nuget looks into those config files to download needed packages, in this case, log4net.

NuGet 的工作只是下载包并提取其中的任何内容,至少在 package.config 项目的恢复场景中是这样。 packages.config 文件中的 targetFramework 属性只被写入,从未被 the nuget client 读取.我不知道它的目的或意图是什么。无论如何,我相信 targetFramework 的值只是您的项目在安装包时使用的 .NET Framework。

Then how come did it download the 4.0 version rather than that of 4.6.1?

背景资料,实在不关心的话可以跳到下一段。如果转到 nuget.org 上的包页面,您将在版本历史记录中看到未显示 1.2.11。但是,如果您查看其他版本的 URL,您可以猜测 the URL for version 1.2.11 .快速离题评论,Fabio M 很接近,但说包不再存在并不完全正确。 “nuget.org does not support permanent deletion of packages. Doing so would break every project depending on the availability of the package, especially with build workflows that involve package restore.”。在包版本页面上,有一条消息说“所有者已取消列出此包。这可能意味着该包已被弃用或不应再使用”。

回到我的观点,进入此 URL 后,将 nuget.org 中的 n 更改为 f 以查看 the package version on fuget.org .在框架旁边,您可以看到软件包支持的框架列表。 net40 是该软件包支持的最高版本。

因此,NuGet“下载 4.0 版本”的原因是因为这是 nuget 包提供的与您的项目兼容的最接近的版本。 .NET 通常被认为是向前兼容的,因此 net45 二进制文件在 net462 运行时上运行,因此当您的项目使用较新版本时,通常可以使用 net45 二进制文件。

最后,关于您遇到的错误,正如我在第一段中所说,在 packages.config 项目中,nuget 的工作只是下载并解压缩包。在安装时,它会向 csproj 添加一些信息,以便编译器可以尝试查找 dll。因此,如果您查看 csproj,您应该找到对 log4net.dll 的引用,它将包含编译器使用的提示路径。如果该提示路径是错误的,那么您将得到您看到的错误。当项目在目录结构中移动但不重新安装包时,这是最常见的。例如,如果 repo 结构最初是“project\project.csproj”,然后更改为“src\project\project.csproj”,则提示路径为“..\packages\log4net.1.2.11\lib\net45\” log4net.dll"是错误的,因为需要添加一个额外的 "..\"以便 packages 文件夹的相对路径是正确的。提示路径错误可能还有其他原因,但这是最常见的原因。

关于C# 项目,编译器提示缺少对 log4net 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55143550/

相关文章:

c# - 使用 ObjectAnimationUsingKeyFrames 切换可见性

c# - UINavigationController 和 UISplitviewController

c# - 反序列化 GUID 数组时出现 JSON.NET 异常

visual-studio - SVN 用乱码数据弄乱了我的文件,为什么?

c++ - 与 Windows 投影文件系统 DLL/LIB 链接

powershell - 尝试使用 Powershell 安装 Sysinternals 时的警告

c# - 将 LINQ 匿名类型转换为 IList<> 时出错

c# - 自定义 XML 文档的验证模式

c++ - 为什么minhook库目录不存在

c# - 在 .Net Framework 中使用最新版本的 System.Net.Http