我已经使用nuget install-package
将一个包(我们称之为PackageA)安装到一个项目中。安装后,我的project.json文件如下所示:
{
"dependencies": {
"PackageA": "1.1.15"
},
"frameworks": {
"net45": {}
},
"runtimes": {
"win": {}
},
"supports": {}
}
现在,PackageA间接依赖于PackageC。 Nuget成功安装了软件包,但是当我编译时出现错误CS1704 "An assembly with the same simple name 'PackageC' has already been imported. Try removing one of the references (...\PackageC.dll) or sign them to enable side-by-side."
对于告诉我该怎么做的人来说,强烈的签名不是一种选择。
如果我删除了CS1704消息建议的引用,那么我收到一条编译错误,指出"Could not copy the file ...\PackageC.dll" because it was not found."
如果我将PackageA版本更改为浮动版本“*”,那么Nuget会抱怨它无法解析一堆依赖项。 (我最终想使用浮动版本。)
{
"dependencies": {
"PackageA": "*"
},
"frameworks": {
"net45": {}
},
"runtimes": {
"win": {}
},
"supports": {}
}
如果我过度指定我的project.json,则该错误消失并且CS1704返回。
{
"dependencies": {
"PackageA": "*",
"PackageB": "*",
"PackageC": "*"
},
"frameworks": {
"net45": {}
},
"runtimes": {
"win": {}
},
"supports": {}
}
一些额外的注释使这更令人困惑:
nuget locals all -clear
)无济于事。 我可以做些什么来调试/修复此问题?
答案 0 :(得分:0)
我可以做些什么来调试/修复此问题?
此错误指出两个引用具有相同的程序集标识,因为有问题的程序集缺少强名称,它们没有签名,因此编译器无法在元数据中区分它们。因此,运行时忽略版本和区域性程序集名称属性。您可以参考Compiler Error CS1704了解更多详情。
要解决此问题,您可以尝试为它们提供强名称,如果您不选择此选项,还可以尝试删除冗余引用或重命名其中一个引用。
您可以检查项目文件以确定" PackageC"已导入(右键单击项目 - >卸载项目 - >编辑项目)。
答案 1 :(得分:0)
Nuget正在导入一个包的非最新版本(称之为PackageX),它将PackageC作为依赖项;反过来导入旧版本的PackageC。这是问题的根源。
我通过清除全局nuget缓存并重建我的解决方案来调试此问题。在这样做之后,我检查了c:\users\<me>\.nuget\packages
中缓存的每个包,我的依赖链中的任何位置都指定了浮动版本。我将这些中的每一个与我的私人订阅源上的最新版本进行了比较,寻找差异。在这样做的过程中,我发现PackageX的过时版本已经与过时版本的PackageC一起缓存。
为了解决这个问题,我对project.json进行了一些额外的过度规范,以包含"PackageX": "*"
作为附加依赖项。一旦我这样做,从我的私人订阅源安装了适当的(最新)版本的PackageX并且编译继续进行而没有问题。