我最近安装了 CsvHelper (https://joshclose.github.io/CsvHelper/),当我尝试使用该库时,出现以下错误:
无法加载文件或程序集“System.Threading.Tasks.Extensions,Version=4.2.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)
在我的 app.config 中,我有绑定重定向:
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>
在我的项目中我也参考了
\packages\System.Threading.Tasks.Extensions.4.5.3\lib etstandard2.0\System.Threading.Tasks.Extensions.dll
它的版本是 4.2.0.1 我不确定为什么它仍然尝试加载 4.2.0.0 的库。
我的项目正在运行.net 4.7.2
我今天在多项目解决方案中遇到了同样的问题,System.Threading.Tasks.Extensions是通过嵌入Autofac包安装的。在两个项目中删除并重新安装 Autofac(通过 nuget)后,两个 packages.config 包含相同的条目
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net472" />
但是虽然有一个项目在
中引用了正确的 dllpackages\System.Threading.Tasks.Extensions.4.5.4\lib
另一个引用了旧版本
packages\System.Threading.Tasks.Extensions.4.5.2\lib
手动从引用中删除旧的 dll(不是通过 nuget)并嵌入正确的 dll 后,一切又恢复正常了。我不明白为什么正确的
packages.config
条目没有强制执行正确的引用。
编辑:
如果它可以在您的开发计算机上运行,但不能在您部署到的计算机上运行,请不要忘记在
web.config
/ app.config
中部署绑定重定向。就我而言,它们看起来像这样:
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>
我在升级.net版本时在多项目解决方案中遇到了这个问题。就我而言,在包管理器控制台中运行
Update-Package -reinstall
命令解决了问题。
根据https://github.com/JoshClose/CsvHelper/issues/1462,这似乎是 CSVHelper 15.0.0 依赖项之一中的错误。 15.0.0 版本(不确定早期版本)引入了一些导致问题的其他程序集。
我个人通过降级到 13.0 来解决这个问题(评论还指出 12.3.2 有效),但该错误报告现在指出他们已经专门发布了 15.0.1 来解决这个问题。我自己还没有确认。
所以我创建了一个新的 .NET 472 项目,然后添加了所有库等和代码,现在它可以工作了。
我怀疑它最初坏了,因为我安装了带有 Excel 插件的非常旧版本的 csvhelper lib。即使我删除了它并删除了所有引用,它仍然从某个地方拾取它。
<assemblyBinding>
<probing privatePath="System.Threading.Tasks.Extensions.dll"/>
</assemblyBinding>
<assemblyBinding>
<probing privatePath="System.Runtime.CompilerServices.Unsafe.dll"/>
</assemblyBinding>
<assemblyBinding>
<probing privatePath="Microsoft.Bcl.AsyncInterfaces.dll"/>
</assemblyBinding>
我今天在多项目解决方案中遇到了这个问题。通过更新有问题的项目中的其他 NuGet 包来修复它。不幸的是,不确定哪一个解决了问题。
CsvHelper当前版本:15.0.5.
就我而言,我的单元测试项目中的 System.Threading.Tasks.Extensions 版本与我的主项目不同,因此在我升级单元测试项目以匹配它为我工作的版本之后。
在运行使用“本机”类库的控制台应用程序(.NEt Framework 4.7.2)时出现此错误,该类库又消耗了 System.Threading.Tasks.Extensions dll。从控制台应用程序中删除类库,然后重新添加,解决了问题。
此答案假设您使用
PackageReference
作为您的 nuget 参考。如果是这种情况,则 PackageReference .Net 工具模型中也存在一个已知错误。对于一些奇怪的情况,nuget Restore msbuild 工具链会放置 ref
程序集,而它应该理想地放置 lib
程序集。如何知道您是否面临类似的问题?您可以使用 ILSpy 等标准反射器应用程序来读取工作目录中发生故障的库的元数据。如果您在其元数据中看到 RefAssemblies 属性,那么您也遇到了这个问题。
要解决此问题,您可以在
csproj
文件中使用类似以下标记的内容来解决 nuget 复制问题。
<Target Name="ReplaceRefWithLib" BeforeTargets="ResolveAssemblyReferences">
<ItemGroup>
<_noCopyRefs Include="@(Reference)" Condition="'%(Reference.Private)' == 'false'" />
<_noCopyRefsByFileName Include="@(_noCopyRefs->'%(FileName)')">
<OriginalItem>%(Identity)</OriginalItem>
</_noCopyRefsByFileName>
<_libByFileName Include="@(ReferenceCopyLocalPaths->'%(FileName)')">
<OriginalItem>%(Identity)</OriginalItem>
</_libByFileName>
<_overlappingRefByFileName Include="@(_noCopyRefsByFileName)" Condition="'@(_noCopyRefsByFileName)' == '@(_libByFileName)' AND '%(Identity)' != ''" />
<_overlappingLibByFileName Include="@(_libByFileName)" Condition="'@(_noCopyRefsByFileName)' == '@(_libByFileName)' AND '%(Identity)' != ''" />
<_overlappingRef Include="@(_overlappingRefByFileName->'%(OriginalItem)')" />
<_overlappingLib Include="@(_overlappingLibByFileName->'%(OriginalItem)')" />
</ItemGroup>
<ItemGroup Condition="'@(_overlappingRef)' != ''">
<Reference Remove="@(_overlappingRef)" />
<Reference Include="@(_overlappingLib)">
<Private>false</Private>
</Reference>
</ItemGroup>
</Target>
希望这有帮助。
对于在 C# 项目引用中新添加的几个 dll,我也遇到了类似的问题,其中我使用 .exe.config 文件进行绑定重定向。我在 .exe.config 文件中提到了旧版本和新版本,但它给出了相同的错误。 我使用此链接启用绑定重定向日志:如何在 .NET 中启用程序集绑定失败日志记录 (Fusion) 我发现有时 dll 从错误的文件夹加载(因为在多个位置具有不同版本的相同 dll 可用)或 .exe.config 中给出的错误绑定版本
示例: .exe.config 放置的文件夹路径:C:older1
System.Threading.Tasks.Extensions.dll 放置的文件夹路径:C:older1 bc\xyz