在过去的几天里,我一直在拼命解决一个安装NuGet软件包后遇到的依赖地狱的情况,该软件包从System.Collections.*
,System.Diagnostics.*
开始, System.IO.*
,System.Runtime.*
,System.Text.*
,System.Threading.*
和System.Xml.*
命名空间。我目前在目标.Net 4.7.1中存在MVC项目问题。
软件包安装将以下绑定重定向添加到我的web.config
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Extensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.ReaderWriter" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Expressions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
...这将导致以下异常:
Could not load file or assembly 'System.IO, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058)
web.config中突出显示的行是:
<add assembly="System.IO, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
我最终发现,如果我删除了System.IO
的bindingRedirect,它清除了该错误,然后抱怨绑定重定向列表中的其他项之一。我一一删除了所有绑定重定向,问题已解决。
我正在努力了解这里发生的事情。例如,如果我在Visual Studio项目的引用中查看System.IO的属性检查器,则如果我在另一个编辑器中打开.csproj文件,它会指向C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1\Facades\System.IO.dll
而不是Nuget文件夹。可以看到该引用确实如下所示:
<Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
这里肯定是错误的,因为有重复的<Private>True</Private>
条目,我已对此进行了更正,但又将它们重新添加了。这是所有新程序集的问题。我想知道Nuget软件包是否存在问题?
任何帮助/建议都将不胜感激。
答案 0 :(得分:2)
我想知道Nuget软件包是否存在问题?
是的,这应该是nuget软件包的问题。一些nuget软件包依赖于CELERY_BROKER_URL = 'amqp://guest:guest@localhost:5672/'
,它将引入那些NETStandard.Library
的依赖,另一方面,一些nuget软件包在.NET Standard框架下的安装依赖不正确,我什至已经报告了{ {3}}和here,此问题与nuget软件包本身有关,我们需要联系此软件包的作者以更新此软件包。
以上可能是您安装了NuGet程序包后添加了system.*
依赖项的原因。同时,.NET Framework 4.7.1添加了对.NET Standard收件箱的支持,我们无需在包中添加这些system。* nuget包。当其他nuget程序包引入这些system.*
依赖项程序包时,nuget / VS将为nuget中的那些程序包添加绑定重定向到web.config文件,但是VS默认使用.net框架中的system.*
程序,在这种情况下,由于绑定重定向,VS可能找不到那些system.*
依赖项。那就是为什么出现错误“无法加载文件或程序集'System.IO ...”的原因。
要解决此问题,解决方法是从web.config文件中删除程序集的绑定重定向。检查线程here以获得一些详细信息。
此外,如果您不想将那些系统依赖项添加到您的项目中,则可以将其从项目中删除。
希望这会有所帮助。