【问题标题】:How to debug/fix 'An assembly with same simple name' has already been imported如何调试/修复“具有相同简单名称的程序集”已被导入
【发布时间】:2017-05-24 22:06:50
【问题描述】:

我使用 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. 这以前是有效的。不知道是什么改变破坏了它。

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

【问题讨论】:

  • 您是否偶然直接引用了 ProjectC dll?这可能是问题所在。删除 ProjectA 和 ProjectC 引用。 ...然后只安装 ProjectA,它应该拉并安装 ProjectC
  • 两种方法我都试过了。到目前为止,我尝试过的所有道路都通向 CS1704。

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


【解决方案1】:

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

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

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

您可以检查项目文件以确保“PackageC”是否已导入(右键单击项目->卸载项目->编辑项目)。

【讨论】:

    【解决方案2】:

    Nuget 正在导入以 PackageC 作为依赖项的非最新版本的包(称为 PackageX);反过来又导入了旧版本的 PackageC。这就是问题的根源。

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

    为了解决这个问题,我对我的 project.json 做了一些额外的过度指定,以包含 "PackageX": "*" 作为额外的依赖项。一旦我这样做了,PackageX 的正确(最新)版本就会从我的私人提要中安装,并且编译会顺利进行。

    【讨论】:

    • 感谢您在这里分享您的解决方案,您可以将其标记为答案,这样可以帮助遇到相同问题的其他社区成员。
    • 完成。差点忘记了,因为 Stack Overflow 让我等了!
    猜你喜欢
    • 2012-12-09
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多