[英]C# project, compiler complaining missing reference to 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版本的呢?
我的理解是nuget會查看這些配置文件以下載所需的軟件包,在這種情況下為log4net。
NuGet的工作僅僅是下載軟件包並提取其中的所有內容,至少在package.config項目的還原方案中。 packages.config
文件中的targetFramework
屬性僅被寫入, 而nuget client從未讀取。 我不知道它的目的是什么。 無論如何,我相信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的引用,它將包含編譯器使用的提示路徑。 如果該提示路徑錯誤,那么您將看到錯誤。 當項目在目錄結構中移動但不重新安裝軟件包時,這是最常見的。 例如,如果存儲庫結構最初是“ project \\ project.csproj”,並且已更改為“ src \\ project \\ project.csproj”,則提示路徑為“ .. \\ packages \\ log4net.1.2.11 \\ lib \\ net45 \\ “ log4net.dll”是錯誤的,因為需要添加一個附加的“ .. \\”,以便packages文件夾的相對路徑正確。 提示路徑錯誤可能還有其他原因,但這是最常見的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.