为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
catspeake 2022-10-23 10:18:12
我正在使用 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 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

我的理解是,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 很接近,但说包不再存在并不完全正确。“ nuget.org 不支持永久删除包。这样做会破坏每个项目,具体取决于包的可用性,尤其是涉及包还原的构建工作流。 ”。在包版本页面上,有一条消息说“所有者已取消列出此包。这可能意味着该包已被弃用或不应再使用”。

回到我的观点,一旦您访问此 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”是错误的,因为额外的“..\” 需要添加,所以包文件夹的相对路径是正确的。提示路径错误可能还有其他原因,但这是最常见的原因。


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 90 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信