【问题标题】:Fakes Broken in Visual Studio 2015在 Visual Studio 2015 中损坏的假货
【发布时间】:2015-11-01 15:34:01
【问题描述】:

我有 Visual Studio 2015 Enterprise,发现我几乎无法编译我们现有的 2013 项目。进一步的调查表明,Visual Studio 2015 无法为 Visual Studio 2013 中正常的类型生成伪造。

考虑以下步骤来重现:

  • 创建一个面向 .NET 4.5 的单元测试项目
  • 在引用选项卡中右键单击“系统”并选择“添加假货程序集”
  • 要消除此示例的噪音,请编辑后续的“System.fakes”文件:
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true">
  <Assembly Name="System" Version="4.0.0.0"/>
  <StubGeneration>
    <Clear/>
  </StubGeneration>
  <ShimGeneration>
    <Clear/>
  </ShimGeneration>  
</Fakes>
  • 然后编辑“mscorlib.fakes”文件以填充 ConcurrentDictionary:
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true">
  <Assembly Name="mscorlib" Version="4.0.0.0"/>
  <StubGeneration>
    <Clear/>
  </StubGeneration>
  <ShimGeneration>
    <Clear/>
    <Add FullName="ConcurrentDictionary"/>
  </ShimGeneration>
</Fakes>
  • 编译项目。

  • 这会在 mscorlib.4.0.0.0.Fakes.messages 文件(在 FakesAssemblies 文件夹中生成)中生成以下错误消息:

警告:编译失败,在没有代码合同的情况下重试

并且在输出窗口中出现以下错误信息:

c:\temp\UnitTestProject1\UnitTestProject1\f.cs(955,13):错误 CS0311:类型“System.Collections.Concurrent.ConcurrentDictionary”不能用作泛型类型或方法中的类型参数“TShimmed” 'ShimRuntime.Bind(TShim,TBound)'。没有从“System.Collections.Concurrent.ConcurrentDictionary”到“System.Collections.Generic.IReadOnlyCollection>”的隐式引用转换。 [c:\temp\UnitTestProject1\UnitTestProject1\obj\Debug\Fakes\m\f.csproj]

c:\temp\UnitTestProject1\UnitTestProject1\f.cs(979,13):错误 CS0311:类型“System.Collections.Concurrent.ConcurrentDictionary”不能用作泛型类型或方法中的类型参数“TShimmed” 'ShimRuntime.Bind(TShim,TBound)'。没有从“System.Collections.Concurrent.ConcurrentDictionary”到“System.Collections.Generic.IReadOnlyDictionary”的隐式引用转换。 [c:\temp\UnitTestProject1\UnitTestProject1\obj\Debug\Fakes\m\f.csproj]

GENERATEFAKES:错误:项目编译失败,退出代码为 1

摆弄 mscorlib.fakes 设置似乎无济于事。 例如,TypeName、FullName 和 Namespace 属性的各种排列会产生相同的“编译失败,退出代码 1”。

禁用代码契约只会破坏它:

警告命名空间“http://schemas.microsoft.com/fakes/2011/”中的元素“Fakes”在命名空间“http://schemas.microsoft.com/fakes/2011/”中具有无效的子元素“StubGeneration”。 UnitTestProject1 c:\temp\UnitTestProject1\UnitTestProject1\Fakes\mscorlib.fakes 4

非常感谢任何帮助了解如何修复/解决此问题。

【问题讨论】:

  • 对此进行快速更新 - 我们发现此错误仅在针对 4.6 以外的任何 .NET 框架时才会出现。由于this issue,我们一直在避免使用 .NET 4.6。
  • 似乎它目前仅适用于存根 ConcurrentDictionary。这解决了我的问题,但很可能无法解决您的问题:/
  • 我打字太快了。我可以存根并发字典,但仍然不能从它的方法中得到任何东西......

标签: .net-4.5 visual-studio-2015 microsoft-fakes


【解决方案1】:
  1. 如果您使用 Visual Studio 2015 Enterprize。请删除 旧 Xrm dll 和添加新 CRM 2016 SDK Xrm Dll 构建项目 还将 .Net Framework 更改为最新版本。

  2. 在构建项目 Generate System Fakes Assembly 后,我们将得到 mscorlib 和 system.Fakes 只需删除这两个文件上的 &lt;Add FullName="ConcurrentDictionary"/&gt; 这一行并构建项目

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多