如何debug/fix 'An assembly with same simple name' 已经导入
How to debug/fix 'An assembly with same simple name' has already been imported
我使用 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 returns。
{
"dependencies": {
"PackageA": "*",
"PackageB": "*",
"PackageC": "*"
},
"frameworks": {
"net45": {}
},
"runtimes": {
"win": {}
},
"supports": {}
}
一些额外的注释使这更令人困惑:
- 所有包依赖项也使用浮动版本。
- 我已经尝试清除 nuget 缓存 (
nuget locals all -clear
) 但无济于事。
- 如果我放弃 project.json 和 nuget 自动恢复,包安装和编译工作正常。不幸的是,这也不是一个选项。
- 这以前有效。不知道是什么改变破坏了它。
我能做些什么来调试/修复这个问题?
What can I do to debug / fix this?
此错误指出两个引用具有相同的程序集标识,因为有问题的程序集缺少强名称,它们未签名,因此编译器无法在元数据中区分它们。因此,运行 时间忽略版本和文化程序集名称属性。详情可参考Compiler Error CS1704
要解决此问题,您可以尝试为它们提供强名称,如果您不选择此选项,您也可以尝试删除冗余引用或重命名其中一个引用.
您可以检查项目文件以确保"PackageC"是否已导入(右键单击项目->卸载项目->编辑项目)。
Nuget 正在导入一个非最新版本的包(称之为 PackageX),它有 PackageC 作为依赖项;反过来又导入了旧版本的 PackageC。这就是问题的根源。
我通过清除全局 nuget 缓存并重建我的解决方案来调试这个问题。这样做之后,我检查了缓存在 c:\users\<me>\.nuget\packages
中的每个包,在我的依赖链中的任何地方都指定了浮动版本。我将其中每一个与我的私人提要上的最新版本进行了比较,寻找差异。在这样做的过程中,我发现一个过时版本的 PackageX 与过时版本的 PackageC 一起被缓存了。
为了解决这个问题,我对 project.json 做了一些额外的过度指定,以将 "PackageX": "*"
作为附加依赖项包含在内。一旦我这样做了,正确的(最新的)版本的 PackageX 就从我的私人提要中安装了,并且编译继续没有问题。
What can I do to debug / fix this?
在某些情况下,使用较旧的代码(并且找不到重复的程序集引用)此错误将在 Visual Studio 的一个版本中发生,但不会在另一个版本中发生。如果您安装了多个版本的 VS,请启动一个较新的版本,然后从“文件”菜单中打开解决方案并构建它。如果错误消失,您有几个不同的选项可以使更改永久化:
如果您觉得特别大胆,您可以手动编辑解决方案 (.sln) 文件,让它始终在工作 VS 版本中打开项目。 (要查找要使用的版本号,请创建一次性项目并检查生成的解决方案文件。)例如:
VisualStudioVersion = 12.0.40629.0
可能会变成
VisualStudioVersion = 15.0.28307.572
但是,由于文件格式在 VS 版本之间可能发生了变化,因此上述操作可能有些风险。所以另一种方法是在工作 VS 版本中重新创建项目并将代码复制过来。
我使用 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 returns。
{
"dependencies": {
"PackageA": "*",
"PackageB": "*",
"PackageC": "*"
},
"frameworks": {
"net45": {}
},
"runtimes": {
"win": {}
},
"supports": {}
}
一些额外的注释使这更令人困惑:
- 所有包依赖项也使用浮动版本。
- 我已经尝试清除 nuget 缓存 (
nuget locals all -clear
) 但无济于事。 - 如果我放弃 project.json 和 nuget 自动恢复,包安装和编译工作正常。不幸的是,这也不是一个选项。
- 这以前有效。不知道是什么改变破坏了它。
我能做些什么来调试/修复这个问题?
What can I do to debug / fix this?
此错误指出两个引用具有相同的程序集标识,因为有问题的程序集缺少强名称,它们未签名,因此编译器无法在元数据中区分它们。因此,运行 时间忽略版本和文化程序集名称属性。详情可参考Compiler Error CS1704
要解决此问题,您可以尝试为它们提供强名称,如果您不选择此选项,您也可以尝试删除冗余引用或重命名其中一个引用.
您可以检查项目文件以确保"PackageC"是否已导入(右键单击项目->卸载项目->编辑项目)。
Nuget 正在导入一个非最新版本的包(称之为 PackageX),它有 PackageC 作为依赖项;反过来又导入了旧版本的 PackageC。这就是问题的根源。
我通过清除全局 nuget 缓存并重建我的解决方案来调试这个问题。这样做之后,我检查了缓存在 c:\users\<me>\.nuget\packages
中的每个包,在我的依赖链中的任何地方都指定了浮动版本。我将其中每一个与我的私人提要上的最新版本进行了比较,寻找差异。在这样做的过程中,我发现一个过时版本的 PackageX 与过时版本的 PackageC 一起被缓存了。
为了解决这个问题,我对 project.json 做了一些额外的过度指定,以将 "PackageX": "*"
作为附加依赖项包含在内。一旦我这样做了,正确的(最新的)版本的 PackageX 就从我的私人提要中安装了,并且编译继续没有问题。
What can I do to debug / fix this?
在某些情况下,使用较旧的代码(并且找不到重复的程序集引用)此错误将在 Visual Studio 的一个版本中发生,但不会在另一个版本中发生。如果您安装了多个版本的 VS,请启动一个较新的版本,然后从“文件”菜单中打开解决方案并构建它。如果错误消失,您有几个不同的选项可以使更改永久化:
如果您觉得特别大胆,您可以手动编辑解决方案 (.sln) 文件,让它始终在工作 VS 版本中打开项目。 (要查找要使用的版本号,请创建一次性项目并检查生成的解决方案文件。)例如:
VisualStudioVersion = 12.0.40629.0
可能会变成
VisualStudioVersion = 15.0.28307.572
但是,由于文件格式在 VS 版本之间可能发生了变化,因此上述操作可能有些风险。所以另一种方法是在工作 VS 版本中重新创建项目并将代码复制过来。