【发布时间】: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