使用ITuple生成假货时出错

Sve*_*man 9 .net microsoft-fakes

我们在我们的解决方案中长期使用Microsoft Fakes框架在测试期间伪造System.DateTime.UtcNow.

最近,虽然几个星期前,我们开始使用C#7功能(使用VS 2017),包括元组作为函数的返回值.现在,我为一个版本创建了一个新的分支.在新分支中,生成假货失败,下面有多条消息

4>C:\Users\...\Source\... 2017\DEV\WebApp.UnitTests\f.cs(116674,53): error CS0234: The type or namespace name 'ITuple' does not exist in the namespace 'System.Runtime.CompilerServices' (are you missing an assembly reference?) [C:\Users\...\Source\... 2017\DEV\WebApp.UnitTests\obj\Debug\Fakes\m\f.csproj] 4>C:\Users\...\Source\... 2017\DEV\WebApp.UnitTests\f.cs(116674,13): error CS0538: 'ITuple' in explicit interface declaration is not an interface [C:\Users\...\Source\... 2017\DEV\WebApp.UnitTests\obj\Debug\Fakes\m\f.csproj]

我试过这个:

  • 将Microsoft.Net.Compilers 2.4.0 NuGet添加到所有项目中
  • 将所有项目升级到目标.NET 4.7(从4.6.1开始),并删除所有System.ValueTuple引用(看作现在内置于.NET 4.7的引用)

我不知道还有什么可以尝试的.当我们第一次开始使用元组并添加了System.ValueTuple NuGet包时,我们没有遇到这个问题.我们在创建新分支时只注意到了这个问题.我想假设FakesAssemblies的构建或NuGet包的恢复必须触发一些东西.

从那时起,我们也发现当我们重建解决方案时会发生这种情况.

编辑:我也尝试删除所有Fakes程序集,引用和配置并重新开始.结果相同.

som*_*pet 14

您可以忽略mscorlib.fakes文件中的ITuple:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
  <Assembly Name="mscorlib" Version="4.0.0.0"/>
  <StubGeneration>
    <Remove FullName="System.Runtime.CompilerServices.ITuple"/>
  </StubGeneration>
</Fakes>
Run Code Online (Sandbox Code Playgroud)

*注意:<StubGeneration>元素在<ShimGeneration>元素之前


Sve*_*man 5

原来,该解决方案针对的是.NET Framework 4.7.1。根据文档(RTFM,我知道...),在该版本中首次ITuple定义System.Runtime.CompilerServices为:

https://msdn.microsoft.com/zh-CN/library/system.runtime.compilerservices.ituple(v=vs.110).aspx

.NET Framework

自4.7.1起可用