C# 项目,编译器抱怨缺少对 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的呢?


catspeake
浏览 91回答 1
1回答

料青山看我应如是

我的理解是,nuget 会查看这些配置文件以下载所需的包,在本例中为 log4net。NuGet 的工作只是下载包并提取其中的任何内容,至少在 package.config 项目的还原方案中是这样。文件中的targetFramework属性packages.config仅由nuget 客户端写入,从不读取。我不知道它的目的或意图是什么。无论如何,我相信targetFramework.NET Framework 的价值只是您的项目在安装包时使用的。那它怎么下载的是4.0版本而不是4.6.1的呢?背景信息,如果你真的不在乎,请跳到下一段。如果您转到 nuget.org 上的包页面,您会在版本历史记录中看到未显示 1.2.11。但是,如果您查看其他版本的 URL,您可以猜出1.2.11 版本的 URL。快速偏离主题的评论,Fabio M 很接近,但说包不再存在并不完全正确。“&nbsp;nuget.org 不支持永久删除包。这样做会破坏每个项目,具体取决于包的可用性,尤其是涉及包还原的构建工作流。&nbsp;”。在包版本页面上,有一条消息说“所有者已取消列出此包。这可能意味着该包已被弃用或不应再使用”。回到我的观点,一旦您访问此 URL,请将 nuget.org 中的 n 更改为 f 以查看 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”是错误的,因为额外的“..\”&nbsp;需要添加,所以包文件夹的相对路径是正确的。提示路径错误可能还有其他原因,但这是最常见的原因。
打开App,查看更多内容
随时随地看视频慕课网APP