C#项目,编译器抱怨缺少对log4net的引用

时间:2019-03-13 13:52:20

标签: 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与4.61)不匹配?

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

1 个答案:

答案 0 :(得分:0)

  

我的理解是nuget查看这些配置文件以下载所需的软件包,在这种情况下为log4net。

NuGet的工作仅是下载软件包并提取其中的任何内容,至少在package.config项目的还原方案中。 targetFramework文件中的packages.config属性仅被写入,the nuget client从未读取。我不知道它的目的是什么。无论如何,我相信targetFramework的值只是安装软件包时项目使用的.NET Framework。

  

那它为什么下载了4.0版本而不是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的引用,它将包含编译器使用的提示路径。如果该提示路径错误,那么您将看到错误。当项目在目录结构中移动但不重新安装软件包时,这是最常见的。例如,如果存储库结构最初是“ project \ project.csproj”,并且已更改为“ src \ project \ project.csproj”,则提示路径为“ .. \ packages \ log4net.1.2.11 \ lib \ net45 \ “ log4net.dll”是错​​误的,因为需要添加一个附加的“ .. \”,以便packages文件夹的相对路径正确。提示路径错误可能还有其他原因,但这是最常见的原因。