“已导入具有相同简单名称的程序集”错误,没有重复引用

时间:2010-07-01 18:31:46

标签: c# msbuild reference

我收到以下错误:

  

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

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

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

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

8 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

我有这个问题,但在我的情况下,我有一个旧的副本放在当前文件夹中,用于加载我的组件,它与当前的一个一起加载,是从我的项目文件夹手动加载的。删除那个旧副本解决了我的问题 我用 Debug> Windows>模块窗口,以查看当时加载了哪些模块并解决了我的问题。

答案 4 :(得分:0)

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

这是因为所有构建命令行属性都是全局的,并且会覆盖任何项目特定的设置。请参阅thisthis

来自上面提到的msdn link

  

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

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

答案 5 :(得分:0)

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

  • 我卸载了列出的项目(右键单击=>卸载项目)
  • 打开XML进行编辑(右键单击已卸载的项目=>编辑{ProjectName.csproj})。
  • 搜索了有问题的.dll,并注意到它在XML中多次列出
  • 删除了与违规dll相关的整个参考标记,并为每个参考副本执行了此操作,但列出的第一个副本除外

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

答案 6 :(得分:0)

请尝试以下操作:从解决方案资源管理器中的参考部分删除Interop.xx.dll并重建项目

答案 7 :(得分:0)

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

例如,在定位Windows 10版本1903时: UWP Runtime Targeting

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

在新的稳定版本可用时,更新 all NuGet软件包是普遍的思想过程,但这本身并不总是一种有用的做法。仅仅因为软件包有新的稳定版本可用,并不意味着您应该或者您可以轻松使用该版本。

即使此SDK合同软件包具有稳定的更新,但它与我的主要项目配置也不兼容,Nuget不知道,因此它允许更新。

Windows SDK Contracts

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

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