无法从Microsoft.Extensions.Logging.Abstractions加载类型。

5
我有一个解决方案,在某些计算机上有效,而在其他计算机上无效。异常是这样的:

从程序集“Microsoft.Extensions.Logging.Abstractions, Version=3.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60”中未能加载类型“Microsoft.Extensions.Logging.Abstractions.Internal.NullScope”

从诊断设置的输出构建添加了信息,显示如下:

在 Services.dll 中抛出异常:“System.Exception”。在 System.Private.Corelib.dll 中抛出异常:“System.Exception”

我正试图找出两台计算机之间的差异,但一直没有头绪。
  • 两台工作/不工作的计算机都运行 VS2017 v15.9.17。
  • 两台计算机都安装了 .NET Framework 4.0
  • 启动项目使用 C# 7.1
  • 启动项目是 .NET Core 2.0
  • 输出显示抛出错误的项目是 .NET Standard 2.0
  • 启动项目使用依赖注入来创建通过 DBContext 访问数据库的服务
  • 失败的调用是:
CustomUnit unit = await _dbContext.CustomUnit
                    .Include(x => x.Type)
                    .Include(x => x.UnitBuckets)
                    .Include(x => x.InventoryBuckets)
                    .Include(x => x.WIPBuckets)
                        .ThenInclude(y => y.Unit)
                    .SingleOrDefaultAsync(x => x.UnitId == unitId);

一直在工作的机器总是工作,而从未工作的机器则永远不工作。我尝试过清除NuGet缓存、删除和重新添加引用、将项目删除并克隆到新位置,但都没有结果。由于所有的机器都从同一个分支上获取了最新代码,并且没有进行任何修改,因此代码库是相同的。但是我无法找到两台机器之间的任何差异,可以解释为什么一台机器可以工作而另一台机器不能。有人有什么想法吗?


考虑到此程序正在运行在.NET Core上,从命令行运行“dotnet --info”并确保两台机器安装了相同版本的运行时。同时尝试在两台计算机上运行“dotnet publish”,将二进制文件复制到另一台计算机上,然后在其他计算机上运行二进制文件以查看是否存在运行时或构建资产问题。 - zivkan
dotnet --info 显示它们正在运行相同的版本。有趣的是,在工作的机器上运行 dotnet publish 会导致在同一台机器上无法正常工作的可执行文件。这是否意味着 VS 在某种程度上访问了 v2.2.0.0 以便看到 NullScope 对象?值得注意的是,与 Microsoft 联系后,我了解到 NullScope 只存在于 2.2.0.0 中,但在 3.0.0.0 中甚至不是一个对象。 - LizP
5个回答

23

我通过从Nuget安装'Microsoft.Extensions.Logging'来解决了这个问题。


很遗憾,那并没有解决我们的问题。 - LizP
对我来说,这也解决了问题,可能是因为https://learn.microsoft.com/en-us/nuget/concepts/dependency-resolution现在将软件包解析为我明确指定的版本。谢谢。 - grafbumsdi

6
问题已解决。我更新项目中的每个Microsoft.Extensions nuget包到3.0.0.0版本,即使它们与Logging.Abstractions似乎无关,这也解决了问题。
更新内容: 1. Microsoft.Extensions.Configuration 2. Microsoft.Extensions.Configuration.Abstractions 3. Microsoft.Extensions.Configuration.Binder 4. Microsoft.Extensions.Configuration.Json 5. Microsoft.Extensions.DependencyInjection 6. Microsoft.Extensions.Options

1

我通过手动将包的项目加载到解决方案中,作为包引用连接它,然后编译,重新启动 Visual Studio,然后将该项目从解决方案中删除,以使其恢复原状,然后再次编译来解决了这个问题。

我不知道为什么这对我有用,我认为这是 Visual Studio 的一个错误...


这听起来非常熟悉... - Chris Catignani

1
问题已解决。我从我的解决方案中删除了所有的'Microsoft.Extensions.Logging.Abstractions',这解决了问题。不需要感谢我))

没错,不用谢,因为 Microsoft.Extensions.Logging 依赖于 Microsoft.Extensions.Logging.Abstractions,所以你的答案会导致代码无法编译。 - Michael

0

又遇到了这个问题,这一次问题是因为我的项目引用了不同版本的Microsoft.Extensions.Logging.Abstractions。

就我所知,我的解决方案中加载的软件包大部分都使用3.x(例如Serilog.AspNetCore 3.x),但有一个软件包(在我这里是Microsoft.EntityFrameworkCore 2.x)加载了2.x版本。对于我来说,我无法升级这一个软件包,因此我必须降级其他所有软件包,以便任何软件包所需的唯一版本是2.x。

有人知道C#不能处理同一软件包的多个版本吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接