【发布时间】:2022-04-13 23:28:56
【问题描述】:
将 EF Core 添加到 NET Standard 项目会引入与其他项目中的 NuGet 包不兼容的传递依赖版本
我有一个包含多个 .NET Standard 2.0 项目的解决方案。
一个项目A使用Google.Protobuf (3.11.2) NuGet包,它依赖于
System.Memory (4.5.3)
System.Buffers (4.4.0)
System.Numerics.Vectors (4.4.0)
System.Runtime.CompilerServices.Unsafe (4.5.2)
其他一些项目也依赖于System.Memory,并且都使用相同的依赖版本。
另一个项目B使用Microsoft.EntityFrameworkCore (3.1.0) NuGet包,依赖于
System.Memory (4.5.3)
System.Buffers (4.5.0)
System.Numerics.Vectors (4.5.0)
System.Runtime.CompilerServices.Unsafe (4.7.0)
尽管System.Memory 的版本在这两种情况下都是(4.5.3),但它依赖于System.Buffers、System.Numerics.Vectors 和System.Runtime.CompilerServices.Unsafe,并且它们的版本不同。
当我运行使用这些项目的应用程序(使用 Unity IoC 的 Microsoft Prism WPF .NET Framework 4.8 应用程序)时,UnityContainer 会引发以下异常:
System.IO.FileLoadException: '无法加载文件或程序集 'System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。
搜索解决方案后,我将此添加到我的 NuGet.Config:
<config>
<add key="DependencyVersion" value="Highest" />
</config>
在%appdata%\Nuget 和.sln 文件的根文件夹中。
我还删除了%userprofile%\.nuget\packages 文件夹。
然后我从项目中删除了 NuGet 包并重新添加了它们,但它们的依赖项与以前的版本相同。
如果我在 Visual Studio 中导航到“为解决方案管理 NuGet 包...”并选择“合并”,它只会显示“未找到包”
【问题讨论】:
-
你的意思是你有两个相同版本的 System.Memory 取决于不同的包版本??
-
@PabloRecalde 是的,这正是我的意思。但我没有安装
System.Memory所以我无法控制它的版本 - 它是作为Google.Protobuf和Microsoft.EntityFrameworkCore的依赖项安装的 -
好像微软搞砸了版本......这对我来说没有任何意义
-
@panoskarajohn 我的 .net 标准项目不引用 .net 核心包 -
Microsoft.EntityFrameworkCore是一个 .net 标准库;)如果您不相信,您可以在 3 分钟内轻松重现我的问题我:) -
@Jinjinov 哦,那真是太糟糕了。最后一个想法:blog.yaakov.online/… 我希望这能让你继续前进,因为它特别提到了底部的类库。如果没有,对不起,我帮不上忙,我希望你能尽快找到解决方案! :)
标签: c# visual-studio entity-framework-core prism unity-container