【问题标题】:Migrating a class library to NetStandard1.4 raises an exception during the execution of the Nunit test将类库迁移到 NetStandard1.4 会在执行 Nunit 测试期间引发异常
【发布时间】:2017-06-25 18:43:36
【问题描述】:

我将一个类库项目迁移到 .Netstandard1.4,其中包含一个 nuget 包 System.Net.Http" Version="4.3.2"

xml .cproj 描述如下:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFramework>netstandard1.4</TargetFramework>
      </PropertyGroup>


      <ItemGroup>           
        <PackageReference Include="System.Net.Http" Version="4.3.2" />                 
      </ItemGroup>
    </Project>

我的单元测试(使用 Nunit 2.4.6 版本)仍然是一个类库项目(.net 4.6.1)(无需迁移)并引用 myStandard1.4 库并编译成功。

我正在使用带有 Resharper 的 vs 2017。

当我尝试运行单元测试时,会触发异常:

    System.IO.FileNotFoundException : Could not load file or assembly 'System.Net.Http, Version=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

注意它说的是“System.Net.Http, Version=4.1.1.1”而不是 NetStandard1.4 库中使用的版本“4.3.2”。

我不得不修改 .NetStandard 项目以通过添加 net461 来支持多目标,异常消失并且工作正常:

  <TargetFrameworks>netstandard1.4;net461</TargetFrameworks>

我的问题:

Q1:为什么异常要求“System.Net.Http,Version=4.1.1.1”而不是我在 NetStandard1.4 中使用的版本“4.3.2”?

Q2:尽管.NET platforms support for .netstandard1.4 支持net461,为什么添加多目标net461 解决了问题?

Q3:我是否必须将我的单元测试类库项目迁移到其他类型?这是什么类型的?

【问题讨论】:

    标签: c# nunit resharper .net-standard


    【解决方案1】:
    1. NuGet 包版本独立于所包含的 dll 文件的程序集版本。程序集的版本控制方式与 .NET Framework 中存在的程序集有些兼容。

    2. System.Net.Http 包含 .net 框架的替代实现。当您在库中定位 net461 时,输出包含适当的 System.Net.Http 库。如果您以 .NET Standard TFM 为目标,则该库应该存在于目标中。

    3. 您也可以通过将System.Net.Http NuGet 包安装到使用项目中来解决此问题。 “新型” csproj 会传递获取 NuGet 引用。

    请注意,在使用需要绑定重定向的库时也可能会出现问题,但这仅影响目前的新型 csproj 测试项目,并将在即将发布的测试平台版本中修复:Interface in .NETStandard 1.1 library does not have implementation in .NET 4.61

    【讨论】:

    • 我手动安装了 System.Net.Http 但其他程序集也有其他例外,我必须一一安装,这不符合逻辑。我还按照您的参考资料中的描述添加了 PropertyGroup,但没有生成 .dll.config。项目似乎看不到 NetStandard 的程序集。这些组件位于何处?如何被项目看到?
    • 你也可以安装NETStandard.Library 1.6.1版本或者切换项目使用PackageReference风格的方式来引用NuGet包而不是packages.config。
    • PackageReference 样式方式或我在使用 mult-target 的问题中描述的方式正在工作。奇怪的是编译成功但运行时出现问题。顺便说一句,我的控制台应用程序也不适用于 netstandrd。在多目标中,外部引用与 netstandard.lib 一起复制,问题消失了。您能否以官方方式向我指出一个文档/演示示例,以将 Netstandard 类库与 nunit 或控制台应用程序一起使用。谢谢
    • 我不知道“官方”的。不过,我建议尝试最新的 VS 2017 预览版并安装 2.0.0 预览版 CLI 并将项目目标设为 netstandard2.0。这将自动安装正确的程序集。 (在 preview1 中有/曾经有一个名为 NETStandard.Library.NETFramework 的 nuget 包需要安装)
    • 谢谢。我会尝试反馈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2011-07-31
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    相关资源
    最近更新 更多