在 Visual Studio 2015 中损坏的假货

Posted

技术标签:

【中文标题】在 Visual Studio 2015 中损坏的假货【英文标题】:Fakes Broken in 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。这解决了我的问题,但很可能无法解决您的问题:/ 我打字太快了。我可以存根并发字典,但仍然不能从它的方法中得到任何东西...... 【参考方案1】:

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

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

【讨论】:

以上是关于在 Visual Studio 2015 中损坏的假货的主要内容,如果未能解决你的问题,请参考以下文章

安装Visual Studio 2015(VS2015)时提示安装包JavaScript_ProjectSystem.msi丢失或损坏的解决方法

win10安装visual studio 2015 出现安装包丢失或损坏是啥原因

win10安装visual studio 2015 出现安装包丢失或损坏是啥原因

Visual studio 2015 中文语言包安装 包丢失或损坏

win10安装visual studio 2015 出现安装包丢失或损坏是啥原因

win10安装visual studio 2015 出现安装包丢失或损坏是啥原因