如何调试/修复'具有相同简单名称的程序集'已导入

时间:2017-05-24 22:06:51

标签: c# .net visual-studio nuget project.json

我已经使用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": {}
}

一些额外的注释使这更令人困惑:

  1. 所有程序包依赖项也使用浮动版本。
  2. 我尝试清除nuget缓存(nuget locals all -clear)无济于事。
  3. 如果我抛弃project.json并进行nuget自动恢复,则包安装和编译工作正常。不幸的是,这也不是一个选择。
  4. 这是以前的工作。不知道改变了什么打破了它。
  5. 我可以做些什么来调试/修复此问题?

2 个答案:

答案 0 :(得分:0)

  

我可以做些什么来调试/修复此问题?

此错误指出两个引用具有相同的程序集标识,因为有问题的程序集缺少强名称,它们没有签名,因此编译器无法在元数据中区分它们。因此,运行时忽略版本和区域性程序集名称属性。您可以参考Compiler Error CS1704了解更多详情。

要解决此问题,您可以尝试为它们提供强名称,如果您不选择此选项,还可以尝试删除冗余引用或重命名其中一个引用

您可以检查项目文件以确定" PackageC"已导入(右键单击项目 - >卸载项目 - >编辑项目)。

答案 1 :(得分:0)

Nuget正在导入一个包的非最新版本(称之为PackageX),它将PackageC作为依赖项;反过来导入旧版本的PackageC。这是问题的根源。

我通过清除全局nuget缓存并重建我的解决方案来调试此问题。在这样做之后,我检查了c:\users\<me>\.nuget\packages中缓存的每个包,我的依赖链中的任何位置都指定了浮动版本。我将这些中的每一个与我的私人订阅源上的最新版本进行了比较,寻找差异。在这样做的过程中,我发现PackageX的过时版本已经与过时版本的PackageC一起缓存。

为了解决这个问题,我对project.json进行了一些额外的过度规范,以包含"PackageX": "*"作为附加依赖项。一旦我这样做,从我的私人订阅源安装了适当的(最新)版本的PackageX并且编译继续进行而没有问题。