我正在使用 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。唯一可疑的是net40-完整在log4net的包路径中找到:”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版本呢?
我的理解是 nuget 会查看这些配置文件来下载所需的包,在本例中为 log4net。
NuGet 的工作只是下载包并提取其中的任何内容,至少在 package.config 项目的恢复场景中是如此。这targetFramework
属性中的packages.config
文件仅被写入,从未被读取nuget客户端 https://github.com/NuGet/NuGet.Client。我不知道它的目的或意图是什么。无论如何,我相信它的价值targetFramework
只是安装包时您的项目正在使用的 .NET Framework。
那为什么下载的是4.0版本而不是4.6.1版本呢?
背景信息,如果您真的不在乎,请跳到下一段。如果您转到 nuget.org 上的包页面,您将在版本历史记录中看到 1.2.11 未显示。但是,如果你查看其他版本的 URL,你可以猜测版本 1.2.11 的 URL https://www.nuget.org/packages/log4net/1.2.11。快速的题外话,Fabio M 很接近,但说该包不再存在并不完全正确。 ”nuget.org 不支持永久删除包。这样做会破坏每个项目,具体取决于包的可用性,尤其是涉及包恢复的构建工作流程。 https://learn.microsoft.com/en-au/nuget/policies/deleting-packages”。在软件包版本页面上,有一条消息说“所有者已取消列出此软件包。这可能意味着该软件包已被弃用或不应再使用”。
回到我的观点,访问此 URL 后,将 nuget.org 中的 n 更改为 f 即可查看fuget.org 上的软件包版本 https://www.fuget.org/packages/log4net/1.2.11。在框架旁边,您可以看到该包支持的框架列表。 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”是错误的,因为需要添加额外的“..\”,以便包文件夹的相对路径正确。提示路径错误可能还有其他原因,但这是最常见的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)