Microsoft.CSharp、System.Collections、System.Threading、框架内冲突的循环警告和 CS1703 错误
Circular Warnings and CS1703 Errors on Microsoft.CSharp, System.Collections, System.Threading, intra-Framework conflict
我注意到 Visual Studio 2015 年针对指定了 asp.net 5 beta8 的项目(1.0.0-beta8 DNX 框架)发出的警告存在循环问题,还有 CS1703 错误现在对我来说是一个问题,从 beta7 开始,一直到 beta8,在 beta6 中没有出现这样的问题。
我的解决方案包含一个主项目和一些子程序集,其中一个子程序集有一个 project.json,它是 Class 库项目 (.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-*
或上面 project.json 中的 4.0.1-*
,我收到警告说它以另一种方式解决了,我可以通过删除 Microsoft.CSharp 项目来解决这个问题,但这会留下一个或多个 CS1703
错误,如果我能摆脱 CS1703 错误,那么我会回到编译失败的状态,因为缺少 Microsoft.CSharp 依赖项。这是一个失败的循环,我正在尝试想办法走出迷宫。
我正在尝试了解和修复这两种问题,目前我已经弄清楚了:
重要的是这是一个解决方案中的一个项目,它依赖于同一解决方案中的其他项目,加上 public 互联网获取的 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.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.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 中添加它。也就是说,我应该寻找一组最小的必需依赖项,并在我处于糟糕状态时一次将它们添加回去,从对同一解决方案中其他项的依赖项很少或没有依赖项的程序集开始。所以我要问的正是这个问题,答案是 "remove the unnecessary item(s) from project.json, in this case, remove the Microsoft.CSharp line from the dependencies"。我不只是在问 "how do I fix one particular manifest",而是希望我可以使这个问题成为关于这些相当奇怪的警告和提示的有用的一般资源,这些警告和提示 Visual Studio 给了你,但我觉得这些并没有帮助我了解并修复根本问题。为此,必须了解在 DNX/DNU 级别和 visual studio 工具级别构建时发生的情况,然后还要了解 .Net class 加载程序级别(在运行时)。
Update2:我有一个解决方案,其中包含几个 ASP.NET 5 个 .xproj 元素,每个元素都取决于我认为该项目元素的正确框架。主要的 asp.net Web 应用程序目前依赖于框架 dnx451
,但是我的插件合同(定义接口并且没有插件的实现)依赖于框架 dotnet
,我认为这可能是正确的这样一个 "abstract" 程序集,其目的是定义类型(接口)并且它没有定义实际实现(没有 classes)。
update3:我现在取得的最好成绩是将错误减少到 1 个剩余的 CS1703,看起来可能是混合框架名字的原因,我想知道混合是否真的在我的 project.json 和自动生成的 project.lock.json,也就是说,我在 ASP.NET 5 工具中遇到了一个错误,该工具是 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.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
Microsoft.CSharp
只应为 dnxcore50
.
导入
参见此处示例:
您实际上是在尝试重新导入作为 dnx451
绰号的一部分已经存在的内容。
注意:
RC1 中的绰号发生了变化。我在这里使用 beta7/8
的绰号。
我注意到 Visual Studio 2015 年针对指定了 asp.net 5 beta8 的项目(1.0.0-beta8 DNX 框架)发出的警告存在循环问题,还有 CS1703 错误现在对我来说是一个问题,从 beta7 开始,一直到 beta8,在 beta6 中没有出现这样的问题。
我的解决方案包含一个主项目和一些子程序集,其中一个子程序集有一个 project.json,它是 Class 库项目 (.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-*
或上面 project.json 中的 4.0.1-*
,我收到警告说它以另一种方式解决了,我可以通过删除 Microsoft.CSharp 项目来解决这个问题,但这会留下一个或多个 CS1703
错误,如果我能摆脱 CS1703 错误,那么我会回到编译失败的状态,因为缺少 Microsoft.CSharp 依赖项。这是一个失败的循环,我正在尝试想办法走出迷宫。
我正在尝试了解和修复这两种问题,目前我已经弄清楚了:
重要的是这是一个解决方案中的一个项目,它依赖于同一解决方案中的其他项目,加上 public 互联网获取的 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.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.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 中添加它。也就是说,我应该寻找一组最小的必需依赖项,并在我处于糟糕状态时一次将它们添加回去,从对同一解决方案中其他项的依赖项很少或没有依赖项的程序集开始。所以我要问的正是这个问题,答案是 "remove the unnecessary item(s) from project.json, in this case, remove the Microsoft.CSharp line from the dependencies"。我不只是在问 "how do I fix one particular manifest",而是希望我可以使这个问题成为关于这些相当奇怪的警告和提示的有用的一般资源,这些警告和提示 Visual Studio 给了你,但我觉得这些并没有帮助我了解并修复根本问题。为此,必须了解在 DNX/DNU 级别和 visual studio 工具级别构建时发生的情况,然后还要了解 .Net class 加载程序级别(在运行时)。
Update2:我有一个解决方案,其中包含几个 ASP.NET 5 个 .xproj 元素,每个元素都取决于我认为该项目元素的正确框架。主要的 asp.net Web 应用程序目前依赖于框架 dnx451
,但是我的插件合同(定义接口并且没有插件的实现)依赖于框架 dotnet
,我认为这可能是正确的这样一个 "abstract" 程序集,其目的是定义类型(接口)并且它没有定义实际实现(没有 classes)。
update3:我现在取得的最好成绩是将错误减少到 1 个剩余的 CS1703,看起来可能是混合框架名字的原因,我想知道混合是否真的在我的 project.json 和自动生成的 project.lock.json,也就是说,我在 ASP.NET 5 工具中遇到了一个错误,该工具是 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.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
Microsoft.CSharp
只应为 dnxcore50
.
参见此处示例:
您实际上是在尝试重新导入作为 dnx451
绰号的一部分已经存在的内容。
注意:
RC1 中的绰号发生了变化。我在这里使用 beta7/8
的绰号。