【发布时间】:2015-11-23 22:19:42
【问题描述】:
我注意到 Visual Studio 2015 发出的警告存在循环问题,对于指定了 asp.net 5 beta8 的项目(1.0.0-beta8 DNX 框架),并且 CS1703 错误现在对我来说是个问题,从beta7开始,beta8继续,beta6没有出现这个问题。
我的解决方案包含一个主项目和一些子程序集,其中一个子程序集有一个 project.json,它是定义一组抽象接口的类库项目 (.xproj) 的一部分,并且它包含一些这样的依赖项列表,并且这些依赖项中的每一个都主要存在,因此我可以在接口定义中使用这些程序集中定义的类型。
plugin-contract 程序集的整个 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 依赖而导致编译失败的状态。这是一个失败的循环,我正在试图弄清楚如何走出迷宫。
我正在尝试理解和修复这两种问题,到目前为止我已经弄清楚了:
重要的是,这是解决方案中的一个项目,它依赖于同一解决方案中的其他项目,以及公共 Internet 获取的 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.
更新:我怀疑我的项目可能会陷入过度指定依赖关系的陷阱。如果我需要dynamic 的东西才能工作,我需要添加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:我现在取得的最好成绩是将错误减少到剩余的 1 个 CS1703,似乎混合框架名字对象可能是原因,我想知道混合是否真的在我的 project.json 和 auto 之间- 生成的 project.lock.json,也就是说,我遇到了 ASP.NET 5 工具中的一个 bug,这是 beta8 中的新问题。
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
【问题讨论】:
-
你为什么使用
dotnet框架而不是dnxXXX或dnxcore50? -
这可能源于我自己的困惑。如果我将其更改为 dnxXXX,会发生什么变化? (
dnx451)。相关:stackoverflow.com/questions/31539341/… -
我发现当这种疯狂的事情需要调试或故障排除时,清理我的
C:\Users\USERNAME\.dnx\packages和C:\Users\USERNAME\.dnx\runtime文件夹,删除project.lock.json文件,并进行实验会有所帮助需要什么框架,dotnet或dnx451或dnxcore50,但在我的特殊情况下,我面临一系列的 catch-22。 -
我几乎可以肯定 System.Runtime 4.0.21 不应该在 dnx451 中加载 - 也许您针对它构建并尝试加载 mscorelib 和 System.Runtime 4.0.21?尝试仅针对 coreclr 构建。
-
我该怎么做?在主 ASP.NET 应用程序以及所有相关子程序集中指定 Framework=dotnet?
标签: c# visual-studio-2015 asp.net-core dnx