我注意到Visual Studio 2015发出警告的循环问题,对于指定了asp.net 5 beta8的项目(1.0.0-beta8 DNX框架),以及CS1703错误现在对我来说是一个问题,从beta7开始并且继续在beta8中,并且在beta6中没有出现这样的问题.
我有一个包含主项目和一些子程序集的解决方案,其中一个子程序集中有一个project.json,它是定义一组抽象接口的类库项目(.xproj)的一部分,它包含一些这样的依赖关系列表和这些依赖关系中的每一个都存在,因此我可以在我的接口定义中使用这些程序集中定义的类型.
插件 – 合约程序集的整个project.json是:
{
"version": "1.0.0-*",
"description": "ITConsolePluginContract Class Library",
"authors": [ "wpostma" ],
"tags": [ "" ],
"projectUrl": "",
"licenseUrl": "",
"dependencies": {
"Microsoft.CSharp": "????",
"System.Collections": "4.0.0-*",
"System.Threading": "4.0.0-*",
"System.Linq": "4.0.1-*",
"System.Runtime": "4.0.21-*",
"Newtonsoft.Json": "7.0.1"
},
"frameworks": {
"dotnet": { }
}
}
但是在我使用这个程序集的主应用程序中,我有:
"frameworks": {
"dnx451": { }
},
在这种情况下,我看到的问题是我一直得到“指定的依赖关系是Microsoft.CSharp> = X但最终得到Microsoft.CSharp Y.无论我是否将4.0.0- *或4.0.1- *放入上面的project.json,我收到警告,它解决了另一种方式,我可以通过删除Microsoft.CSharp项目,但这留下一个或多个CS1703错误,如果我可以摆脱CS1703错误然后我回到编译失败的状态,因为缺少Microsoft.CSharp依赖.这是一个失败的圈子,我试图弄清楚如何摆脱迷宫.
我试图理解并修复这两类问题,到目前为止我已经想到了:
>重要的是,这是一个解决方案中的一个项目,它依赖于同一解决方案中的其他项目,以及公共互联网提取的nuget包.
>我相信我需要确保删除对dnx 1.0 beta 7或更早版本的软件包的任何显式引用,但这样做并非易事,因为软件包版本的编号并不完全相同.例如,System.Collections 4.0.10和4.0.11-beta版本是可用的,并且不仅仅是版本编号本身不适用于beta 7或6或8或4或其他任何版本.
那么,鉴于此,你如何清理包及其参考?我意识到ASP.NET beta周期中经常出现重大变化会加剧这个问题,但我认为这是一个微观世界,一个时间压缩的视图,用于维护Asp.Net应用程序的未来.
什么特别导致我上面观察到的循环行为,你如何解决这个问题?可以用什么做法来避免陷入这个失败的陷阱?
其次,这种行为是否与我现在拥有的两个构建错误有任何关联:
CS1703 Multiple assemblies with equivalent identity have been imported: 'C:\Users\LOCALUSERNAME\.dnx\packages\System.Collections\4.0.10\ref\dotnet\System.Collections.dll' and 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\Facades\System.Collections.dll'. Remove one of the duplicate references.
CS1703 Multiple assemblies with equivalent identity have been imported: 'C:\Users\LOCALUSERNAME\.dnx\packages\System.Threading\4.0.10\ref\dotnet\System.Threading.dll' and 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\Facades\System.Threading.dll'. Remove one of the duplicate references.
更新:我怀疑我的项目可能会陷入过度指定依赖关系的陷阱.如果我需要动态的东西,我需要添加Microsoft.CSharp,如果我不是绝对需要它,我不应该在我的project.json中.也就是说,我应该寻找一组最小的必需依赖项,并在我处于错误状态时一次添加一个,从同一解决方案中对其他项很少或不依赖的程序集开始.所以我正在询问这个问题,答案是“从project.json中删除不必要的项目,在这种情况下,从依赖项中删除Microsoft.CSharp行”.我不只是问“我如何修复一个特定的清单”,但我希望相反,我可以将这个问题作为这些相当奇怪的警告的有用的一般资源,并提示Visual Studio给你我不觉得帮助我理解和修复潜在的问题.要实现这一点,必须了解DNX / DNU级别和Visual Studio工具级别的构建时发生的情况,然后还要了解.Net类加载器级别(运行时).
Update2:我有一个解决方案,其中包含几个ASP.NET 5 .xproj元素,每个元素都取决于我认为该项目元素的正确框架.主要的asp.net Web应用程序当前依赖于框架dnx451,但我的插件 – 契约(定义接口和没有插件的实现)依赖于框架dotnet,我认为这对于这样一个“抽象”程序集来说可能是正确的,其目的是定义类型(接口),它没有定义实际的实现(没有类).
update3:我现在取得的最好成绩就是将错误减少到剩余的CS1703,看起来可能是混合框架标记可能是原因,我想知道混合实际上是在我的project.json和自动生成的项目之间.lock.json,也就是说,我正在尝试在beta8中新增的ASP.NET 5工具中的一个bug.
Build The design time host build failed with the following error:
error CS1703: Multiple assemblies with equivalent identity have been
imported:
'C:\Users\USERNAME\.dnx\packages\System.Runtime\4.0.21-beta-23409\ref\dotnetSystem.Runtime.dll'
and 'C:\Program Files (x86)\Reference
Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\FacadesSystem.Runtime.dll'.
Remove one of the duplicate references.
如果我将所有内容放回beta7以查看这是否是beta8错误,则此错误会更改为另一个神秘错误:
CS1703 Build Multiple assemblies with equivalent identity have been imported: '<in-memory assembly>' and '<in-memory assembly>'. Remove one of the duplicate references.
在bitbucket上的示例项目,在mercurial:https://bitbucket.org/wpostma/itconsole-demo
最佳答案 只应为dnxcore50导入Microsoft.CSharp.
见这里的例子:
您实际上正在尝试重新导入已存在的东西作为dnx451名字对象的一部分.
注意:
RC1改变了观众.我在这里使用mon7为beta7 / 8.