从 .Net 4.6.1 单元测试引用 .Net 标准项目时缺少方法异常

Missing Method Exception When Referencing .Net Standard Project From .Net 4.6.1 Unit Test

当 运行 使用 System.IO.Compression.ZipFile.Open 的 .Net 4.6.1 单元测试时,如果单元测试项目引用 .Net Standard 2.0 程序集,我会收到以下异常:

System.MissingMethodException: Method not found: 'System.IO.Compression.ZipArchive System.IO.Compression.ZipFile.Open(System.String, System.IO.Compression.ZipArchiveMode)'.
    at UnitTestProject.UnitTest1.TestMethod1()

单元测试项目是使用 VS 2017 单元测试项目(不是 .NET Core 项目)创建的,并且已将引用添加到 System.IO.Compression.FileSystem 和我的标准 class 库:

using System.IO.Compression;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestProject
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            string zipfilename = "C:\temp\out.zip";
            using (ZipArchive zipArchive = ZipFile.Open(zipfilename, ZipArchiveMode.Read)) { }
        }
    }

.net 标准 class 库只是一个 class 没有方法:

namespace StandardClassLib
{
    public static class Zipper
    { // Class is empty.
    }
}

我在 Visual Studio 中使用 Test Explorer 并在命令行中使用 vstest.console.exe.

时遇到同样的错误

请注意,此行为仅在单元测试项目中出现,控制台应用程序工作正常。

任何人都可以帮助我理解为什么这不起作用以及解决此问题的方法(如果可能)吗?

发生这种情况是因为测试项目需要一些额外的绑定重定向,这些重定向需要在构建过程中生成。虽然项目属性对话框有一个自动生成绑定重定向的选项,但这对库(经典单元测试项目)没有影响,因此您需要手动编辑 .csproj 文件以包括:

<PropertyGroup>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>

有关更多详细信息和解释,请参阅公告 GitHub 问题 Issues with .NET Standard 2.0 with .NET Framework & NuGet 及其链接的讨论问题。