在 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 只需删除这两个文件上的 <Add FullName="ConcurrentDictionary"/>
这一行并构建项目
【讨论】:
以上是关于在 Visual Studio 2015 中损坏的假货的主要内容,如果未能解决你的问题,请参考以下文章
安装Visual Studio 2015(VS2015)时提示安装包JavaScript_ProjectSystem.msi丢失或损坏的解决方法
win10安装visual studio 2015 出现安装包丢失或损坏是啥原因
win10安装visual studio 2015 出现安装包丢失或损坏是啥原因
Visual studio 2015 中文语言包安装 包丢失或损坏