【问题标题】:How can I resolve this? The unit type exists in two dll files我该如何解决这个问题?单元类型存在于两个dll文件中
【发布时间】:2012-05-31 20:33:54
【问题描述】:

我目前正在学习使用 Visual Studio 11 beta 的教程。尝试在我的一个类中设置字段值的最大长度时:

[MaxLength(50)]
public string LastName { get; set; }

因为MaxLength() 函数存在于两个地方,所以它会出错并且不会让我编译:

错误 4 类型“System.ComponentModel.DataAnnotations.MaxLengthAttribute”存在于“c:\Users\me\Documents\Visual Studio 11\ContosoUniversity\packages\EntityFramework.4.1.10331.0\ lib\net40\EntityFramework.dll' 和 'c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\System.ComponentModel.DataAnnotations.dll'

我已尝试删除这两个文件,但这只会导致更多问题,因为我项目中的其他代码依赖于它们。

有没有办法告诉它使用其中一个或另一个?

所有这些方法似乎都不适合我。请参阅答案下的 cmets。还有其他想法吗?

谢谢

【问题讨论】:

  • 全名空间呢,它们也一样吗?
  • 感谢您的帮助。看起来你的一些答案(如果不是全部的话)都会奏效。明天我可以在我的另一台电脑上测试它,然后选择一个答案。谢谢。
  • 不幸的是,这种方法直到不起作用,系统仍然检测到 System.ComponentModel.DataAnnotations.MaxLengthAttribute 的两次出现我试图通过命令提示符创建一个外部别名 - 通过转到 dll 并键入/r:GridV1=grid.dll 但它无法识别命令或其他东西。
  • @L.B 当错误消息指出不同程序集中存在具有相同完全命名空间限定名称的两种类型时,提供完整命名空间将无济于事。在这两种情况下都是一样的。他的问题是他引用了太多的程序集,并且他从中得到了重复。

标签: c# asp.net-mvc visual-studio dll controller


【解决方案1】:

在代码顶部使用 using:

using MaxLength = System.ComponentModel.DataAnnotations

【讨论】:

  • 当我尝试这个时,我仍然收到此错误“错误 1 ​​'System.ComponentModel.DataAnnotations' 不是属性类”
  • 然后简单地引用它的完全限定名;)。
  • 当两种类型具有相同的完全命名空间限定名称时,使用该名称提供完整命名空间是没有用的。他应该检查他是否引用了太多的程序集。在 不太可能 的情况下,引用两个都具有 System.ComponentModel.DataAnnotations.MaxLengthAttribute 类的不同程序集确实是个好主意,他应该使用 extern alias ThisOneHere; 然后 [ThisOneHere::System.ComponentModel.DataAnnotations.MaxLength(50)]正如 Martin Ernst 的回答所建议的那样。
【解决方案2】:

只需从包中卸载 EntityFramework 并重新安装它(EntityFramework)。这个对我有用。只需按照以下步骤操作即可:

1.右键点击参考 2.点击管理nugetpackages。

3.点击卸载

  1. 进入在线部分并在搜索框中输入实体框架 5.点击安装按钮

【讨论】:

  • 是的,这是唯一对我有用的解决方案,它还避免了添加额外的代码、别名等。
  • 这也对我有用。就我而言,我已将我的项目从 .NET 4.0 升级到 4.5。我的错误列表显示了一些需要重新安装的 nugget 包(特别是 EntityFramework)。它以警告的形式出现,但在您发帖之前我一直忽略它。
【解决方案3】:

用所需的命名空间限定属性

[System.ComponentModel.DataAnnotations.MaxLength(50)]
public string LastName { get; set; } 

【讨论】:

  • 我仍然得到“错误 2 类型或命名空间名称 'MaxLength' 不存在于命名空间 'System.ComponentModel.DataAnnotations' (您是否缺少程序集引用?)”它仍然存在于两个位置“错误 3 类型 'System.ComponentModel.DataAnnotations.MaxLengthAttribute' 存在于两个 'c:\Users\me\Documents\Visual Studio 11\ContosoUniversity2\packages\EntityFramework.4.1.10331.0\lib\net40\EntityFramework.dll ' 和 'c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.ComponentModel.DataAnnotations.dll'"
  • 显然它在两个库的同一个命名空间中。引用同一个库的两个不同版本并不是一个好主意。如果可以,请删除一个参考。否则,请使用我在此 SO 帖子 stackoverflow.com/a/10841652/880990 中描述的过程来解决命名空间冲突。
  • 在阅读您另一篇文章中的文章之前,我一直无法理解。谢谢。
【解决方案4】:

如果您在最新环境(VS 2017/.NET Framework 4.6.x)和实体框架(如 6.1 或 6.2)中遇到相同的错误,这里是解决方案;

将您的实体框架降级到 6.0。它会起作用的。

【讨论】:

    【解决方案5】:

    MaxLength 不是一个函数,它是一个属性。
    您可以在每个文件中使用 using 指令来指定当前正确的上下文。
    或者只输入完整的命名空间,例如System.ComponentModel.DataAnnotations.MaxLength

    【讨论】:

      【解决方案6】:

      尝试使用外部别名http://msdn.microsoft.com/en-us/library/ms173212.aspx 来区分这两个程序集

      另请查看页面底部附近的http://bartdesmet.net/blogs/bart/archive/2006/10/07/4502.aspx 是一个示例

      【讨论】:

      • 我尝试转到 dll 并分配别名,但出现以下错误“文件名、目录名或卷标不正确。”
      【解决方案7】:

      这个问题现在是这个问题的最佳答案,所以我想我会在这里回答。

      The type 'BLAH' exists in both错误经常出现在以下几种情况:

      1.重复文件 - (通常非常简单)众所周知,.dll 文件就是这种情况。在大多数重复的情况下,删除其中一个重复文件是最简单和最好的解决方案

      2。非重复文件 - (更复杂,例如原始发帖人的案例)不幸的是,您需要编辑并经常重新编译/查找文件的替代版本,以免出现此类冲突。幸运的是,用相同的命名空间限定属性通常会解决这样的冲突。

      例如,如果您的代码在多个文件中提到的名为 MaxLength 的内容上发生冲突,则在必要的文件中对其进行限定,以明确您要使用的 MaxLength,如下所示:System.ComponentModel.DataAnnotations.MaxLength。这应该有助于清除问题,因此在尝试运行代码时不会发生任何冲突

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-25
        • 2020-02-14
        • 2021-07-31
        相关资源
        最近更新 更多