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

问题描述 投票:2回答:1

我正在使用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呢?

c# visual-studio nuget log4net
1个回答
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的引用,它将包含编译器使用的提示路径。如果该提示路径错误,那么您将收到您看到的错误。当项目在目录结构中移动但不重新安装包时,这是最常见的。例如,如果repo结构是原始的“project \ project.csproj”并且它被更改为“src \ project \ project.csproj”,那么提示路径为“.. \ packages \ log4net.1.2.11 \ lib \ net45 \ log4net.dll“错误,因为需要添加一个额外的”.. \“,因此packages文件夹的相对路径是正确的。提示路径可能有其他原因,但这是最常见的原因。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.