发现不同版本的"Microsoft.Bcl.AsyncInterfaces"之间存在冲突

10

我有一个使用netstandard2.0库的应用程序,由net5.0应用程序使用。其中一个被库引用的软件包引用了Microsoft.Bcl.AsyncInterfaces 5.0.0。但是,每个应用程序都会收到此警告:

47>C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2203,5):
 warning MSB3277: Found conflicts between different versions of "Microsoft.Bcl.AsyncInterfaces" that could not be resolved.
There was a conflict between "Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" and "Microsoft.Bcl.AsyncInterfaces, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51".
    "Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" was chosen because it was primary and "Microsoft.Bcl.AsyncInterfaces, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" was not.
    References which depend on "Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" [C:\Users\IgorBe\.nuget\packages\microsoft.bcl.asyncinterfaces\1.1.1\ref\netstandard2.1\Microsoft.Bcl.AsyncInterfaces.dll].
        C:\Users\IgorBe\.nuget\packages\microsoft.bcl.asyncinterfaces\1.1.1\ref\netstandard2.1\Microsoft.Bcl.AsyncInterfaces.dll
          Project file item includes which caused reference "C:\Users\IgorBe\.nuget\packages\microsoft.bcl.asyncinterfaces\1.1.1\ref\netstandard2.1\Microsoft.Bcl.AsyncInterfaces.dll".
C:\Users\IgorBe\.nuget\packages\microsoft.bcl.asyncinterfaces\1.1.1\ref\netstandard2.1\Microsoft.Bcl.AsyncInterfaces.dll
    References which depend on "Microsoft.Bcl.AsyncInterfaces, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" [].

请注意,“导致引用的项目文件项”不是一个项目,而是dll本身。我猜测编译器与.NET标准一起使用1.0.0版本提供一些核心异步功能。但是如何消除此消息?似乎没有针对.NET 5.0的绑定重定向。

1
我不知道如何摆脱它,但你可以从查看你的 obj\project.assets.json 文件并搜索 AsyncInterfaces 来获取更多信息。在我的情况下,它出现在 "Azure.Core/1.24.0" 下(这是我写作时的最新版本),所以我不知道该怎么办 - 这是一个错误警告吗? - undefined
对于这种情况,我通常会从清理项目开始,然后手动删除任何 bin/obj 文件夹。如果这样还不能解决问题,我会尝试明确安装 Microsoft.Bcl.Interfaces NuGet 包。 - undefined
1个回答

1
我刚刚遇到了同样的问题,并且发现问题出在包含了 IAsyncDisposable 资源上。
我通过手动释放任何 IAsyncDisposable 资源来解决了这个问题,而不是使用 await using ... 的写法。

Ex.:

public async Task MyFunction()
{
    await using var disposableResource = _factory.GetMyDisposableResource();
    // rest of code.
}

public async Task MyFunction()
{
    MyDisposableResource disposableResource = default!;
    try
    {
        disposableResource = _factory.GetMyDisposableResource();
        //rest of code
    }
    finally
    {
        if(disposableResource is not null)
            await disposableResource.DisposeAsync().ConfigureAwait(false);
    }
}

那看起来像是个糟糕的临时解决办法。我得想象一下是否有更好的解决方案。 - undefined
我很好奇,想知道在构建一个 .Net Standard 2.1 库而不是 2.0 的情况下,问题是否仍然存在。 - undefined
我想知道为什么你会认为它是一个糟糕的应急措施。Try..Finally基本上就是将using操作符转换成的形式。 - undefined
使用十行样板代码,无论何时使用IAsyncEnumerable,来抑制一个不应该出现的编译器警告,而不是解决根本原因?在我看来,这是一个很好的应急措施的例子。我知道行为应该是相同的,只要人们总是完全正确地使用样板代码。但我认为这对代码的清晰度和可维护性有非常不利的影响。 - undefined

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