【问题标题】:Circular Warnings and CS1703 Errors on Microsoft.CSharp, System.Collections, System.Threading, intra-Framework conflictMicrosoft.CSharp、System.Collections、System.Threading、框架内冲突上的循环警告和 CS1703 错误
【发布时间】: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框架而不是dnxXXXdnxcore50
  • 这可能源于我自己的困惑。如果我将其更改为 dnxXXX,会发生什么变化? (dnx451)。相关:stackoverflow.com/questions/31539341/…
  • 我发现当这种疯狂的事情需要调试或故障排除时,清理我的C:\Users\USERNAME\.dnx\packagesC:\Users\USERNAME\.dnx\runtime 文件夹,删除project.lock.json 文件,并进行实验会有所帮助需要什么框架,dotnetdnx451dnxcore50,但在我的特殊情况下,我面临一系列的 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


【解决方案1】:

Microsoft.CSharp 只能为dnxcore50 导入。

参见此处的示例:

https://github.com/aspnet/dnx/blob/2acce95b3f2ad4e924bc36471ed8f08ee1fccd2b/misc/BootstrapperSolution/src/TesterProgram/project.json

您实际上是在尝试重新导入已作为 dnx451 名称的一部分存在的内容。

注意:

RC1 更改了名称。我在这里使用beta7/8 的绰号。

【讨论】:

  • 一些编译器警告会很好,如果有微软正在阅读这个。
  • 我会把这个链接发给他们,看看他们能不能做点什么。
  • 但是我的回答解决了你的问题吗?
  • 是的。这是核心问题。不幸的是,我的代码太混乱了,我无法弄清楚如何解决依赖关系。我依赖一些第三方的东西,这些东西还没有为 dnx 做好准备。我相信这将是用户点击它的正常情况。
猜你喜欢
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 2021-06-20
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多