【问题标题】:"An assembly with the same simple name has already been imported" error without duplicate reference“已导入具有相同简单名称的程序集”错误,没有重复引用
【发布时间】:2011-03-10 19:00:41
【问题描述】:

我收到以下错误:

错误 CS1704:具有相同简单名称的程序集 'Interop.xxx.dll,版本=1.0.0.0,文化=中性, PublicKeyToken=null 已经被导入。尝试删除其中一个 引用或签署它们以启用并排。

我所看到的一切都表明我引用了两个同名的程序集,我需要删除其中一个。但是,我已经检查过了,我只引用了一次。

这也仅在我使用 msbuild 从开发盒上的命令行构建时才会发生。如果我通过 Visual Studio 构建或在我们的 CI 服务器上进行干净构建,我不会看到此错误。

我已经尝试完全删除我的所有源代码并从头开始构建以更接近构建机器,但没有运气。

【问题讨论】:

标签: c# msbuild reference


【解决方案1】:

对于那些开发 UWP 项目的项目引用,这些项目引用特别包括 Microsoft.Windows.SDK.Contracts nuget 包(或引用它的其他依赖项),当 SDK 合同的版本针对不同版本的运行时,这是一个常见错误你的项目是如何配置的。

例如,当面向 Windows 10 版本 1903 时:

任何依赖项或参考项目都应针对或至少支持相同的运行时版本。

当有新的稳定版本可用时,更新所有 NuGet 包是一种常见的思考过程,但这本身并不总是有用的做法。仅仅因为一个包的新稳定版本可用并不意味着您应该或可以轻松使用该版本。

尽管这个 SDK 合约包有一个稳定的更新,但它与我的主项目配置不兼容,Nuget 不知道所以它允许更新。

此包专门设计用于为支持 Windows 平台定位的项目类型提供 Windows dll,它复制 UWP 定位配置中包含的相同 dll。通过安装更高版本的包,来自卫星项目的引用将与由于平台定位而提供的引用一起包含在输出中,最终导致 OP 错误。

Windows IoT 设备运行时有类似的 SDK 和目标包,如果您像我的团队经常遇到的那样遇到此问题,此信息应该可以帮助您识别和解决这些问题 :)

【讨论】:

    【解决方案2】:

    在我的情况下,重复条目是由 NuGet 包引用和对包文件夹中同一程序集的直接文件引用引起的。我不确定项目是如何进入这种状态的,但卸载项目并在 XML 文件中搜索有问题的程序集名称解决了我的问题。

    请注意,在我的情况下,这开始发生在将 NuGet 包更新到较新版本且对项目没有其他更改后,因此这可能是由 NuGet 中的错误引起的。

    【讨论】:

    • 我的情况类似:以前由 NuGet 引用的 dll 作为项目添加到解决方案中(并在那里更新为较新的版本)。之后,CS1704 无故发生。但是仍然存在对旧版本 dll 的传递依赖,它总是拉它并引发错误!
    【解决方案3】:

    试试这个:从解决方案资源管理器的参考部分删除 Interop.xx.dll 并重建项目

    【讨论】:

    • 更新 nuget 包给我带来了无尽的痛苦和心痛
    【解决方案4】:

    在“错误列表”窗口中,触发此错误的项目列在“项目”列中。我通过执行以下操作解决了该错误:

    • 我卸载了列出的项目(右键单击 => 卸载项目)
    • 打开 XML 进行编辑(右键单击已卸载的项目 => 编辑 {ProjectName.csproj})。
    • 搜索有问题的 .dll,发现它在 XML 中被多次列出
    • 删除了与违规 dll 相关的整个引用标记,并且对除列出的第一个引用之外的每个引用副本都这样做了

    它被多次列出的原因是因为几个引用的库使用了那个 dll。这本身不应该是一个问题,所以我不确定是什么导致这个错误突然出现在我面前。如果我弄清楚了,我会更新这个答案。

    【讨论】:

      【解决方案5】:

      对于与我相同的其他人:如果使用属性 AssemblyName 通过命令行构建,它将覆盖所有解决方案项目生成的所有程序集 - 换句话说,您最终将得到 (N -1) 个名为同样,其中 N 是编号。项目 - 启动项目(通常会生成一个 exe)。

      发生这种情况是因为所有构建命令行属性都是全局的,并且会覆盖任何特定于项目的设置。见thisthis

      来自上面提到的msdnlink

      全局属性是使用 命令行上的 /property 开关,或由 项目之前的集成开发环境 (IDE) 建成。 这些全局属性适用于所有项目 使用此引擎构建

      在我的特定情况下,Jenkins 是 CI 工具,我最终在最后添加了一个 Windows 批处理命令,将 .exe 重命名为我在传递 AssemblyName 参数时最初想要的名称。

      【讨论】:

        【解决方案6】:

        我遇到了这个问题,但就我而言,我在当前文件夹中放置了一个旧副本,用于加载我的组件的 EXE,它与当前的组件一起加载,它是从我的项目文件夹中手动加载的。删除那个旧副本解决了我的问题。
        我使用 Debug > Windows > Modules 窗口查看当时加载了哪些模块并解决了我的问题。

        【讨论】:

          【解决方案7】:

          看来我今天无法阅读!
          该项目有一个对互操作的引用和一个生成“相同”互操作的 COM 引用。所以有两个,我只是没有很好地搜索。我仍然不明白为什么它在其他地方有效,但这确实解决了它。

          【讨论】:

          • +1 - 谢谢 - 这个错误今天突然出现在我身上,我遇到了完全相同的问题。
          【解决方案8】:

          如果这是一个 Web 项目,是否有对其他版本的强名称引用?这些不会显示为项目依赖项,但会导致您描述的运行时错误。希望有帮助

          【讨论】:

            猜你喜欢
            • 2012-12-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多