关于c#:Namespace无法识别(即使它在那里)

Namespace not recognized (even though it is there)

我得到这个错误:

The type or namespace name 'AutoMapper' could not be found (are you missing a using directive or an assembly reference?)

有趣的是,我的项目中已经有了这个参考:

ProjectThatFails

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System.Collections.Generic;
using DataContract;
using SelectorDAL;
using AutoMapper;

namespace SpecimenSelect
{
    public class SpecimenSelect : ISpecimenSelect
    {
        public SpecimenSelect()
        {
            SetupMaps();
        }

        private static void SetupMaps()
        {
            Mapper.CreateMap<SpecimenDetail, SpecimenDetailContract>();
        }

另一件奇怪的事情是,我的解决方案中还有另外两个项目都使用automapper,并且引用了完全相同的automapper.dll文件。它们都工作得很好。

以下是一个屏幕截图:

ProjectThatWorks

这是代码(编译得很好):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System.Collections.Generic;
using AutoMapper;
using DataContract;
using SelectorDAL;

namespace PatientSelect
{

    public class PatientSelect : IPatientSelect
    {
        public PatientSelect()
        {
            SetupMaps();
        }

        private void SetupMaps()
        {
            Mapper.CreateMap<Patient, PatientContract>();
            Mapper.CreateMap<OrderedTest, OrderedTestsContract>();
            Mapper.CreateMap<Gender, GenderContract>();
        }

两个引用在属性页上的数据似乎相同。

我错过了什么?

我试过:

  • 重新启动Visual Studio
  • 不带using语句的引用(即AutoMapper.Mapper.CreateMap)
  • 清理和重建
  • 还有其他想法吗?


    检查以确保您的项目没有设置为使用.NET Framework 4客户端配置文件。

    您可以通过右键单击项目(而不是解决方案)来检查/更改此项,选择属性->应用程序->目标框架。目标框架是该页上的下拉列表。

    这在Visual Studio中是一个问题(我甚至称之为bug)。automapper需要从.NET Framework 4客户端配置文件中排除的程序集。因为您的项目使用的是该版本的框架,所以它会中断。

    当要引用的项目的.NET Framework版本高于进行引用的项目时,类似的错误将传播到生成过程。也就是说,一个目标为4.5的项目引用了目标为4.5.1的项目会给你同样的错误。

    发生这种情况时,需要有一个更好的错误消息,因为没有合理的解释为什么它不会按照错误消息告诉您引用已明确引用的程序集来构建。


    让我问一个愚蠢的问题:有两个automapper.dll文件吗?一个带有AutoMapper名称空间,另一个没有?确认两个项目中的路径。

    我还注意到using命令的顺序不同。没关系,但你试过洗牌吗?


    如果您的类没有编译,即使它在项目中,也要检查以下内容:

  • 类名是否完全相同
  • 名称空间是否完全相同
  • 类属性是否显示生成操作=编译

  • 我通过右键单击包含文件的文件夹并选择"从项目中排除",然后再次右键单击并选择"包含在项目中"(首先必须启用"显示所有文件"以使排除的文件夹可见)来解决此问题。


    我有一个类似的问题,即参考文献在VS2010中未被识别,并且本文的答案无法更正。

    我的解决方案中的问题与引用项目所在路径的扩展有关。在使用SVN时,我做了一个存储库的分支来做一些测试,该分支在路径结构中增加了两个级别,因此路径变得太长,无法在Windows中使用。这不会引发任何错误,但无法识别项目引用的命名空间。当我把项目的位置改为有一条更小的路径时,一切都很顺利。


    在我的例子中,引用的dll是在更高版本的.NET Framework中构建的。在添加引用之后,我可以使用它。但一旦我做了一个构建,就会弹出"缺少引用"错误。我刷新DLL,错误将消失,但它将永远不会生成。这篇文章让我检查了框架版本,因此我可以通过在同一版本中构建引用的项目来解决这个问题。


    如果所有其他答案都不能帮到你,那么这一定是最简单的解决方案。

    我在答案中寻找我的设置有什么问题,尝试了所有的答案-都没有成功,然后我意识到Visual Studio 2018是由微软开发的。所以我做了大多数人做的,

    已重新启动Visual Studio它起作用了


    该问题已被授予,但还有其他细节尚未描述,需要检查。

    我也有这种行为,在项目A中引用了项目B,但是在项目A中没有识别出项目B的名称空间。经过一些挖掘,我发现我的路径太长。通过减少项目的路径(A和B),引用变得可见并可用。

    我通过在更小的路径深度创建项目C来测试这个理论。我在项目A中引用了项目C。这些引用按预期工作正常。然后,我从解决方案中删除了项目C,只是将项目C移到一条与项目B相同的深路径上,并将项目C重新添加到解决方案中,并尝试编译。然后我再也看不到项目C对象了。


    可能项目的类型表处于不正确的状态。我会尝试删除/添加引用,如果不起作用,则创建另一个项目,导入我的代码,然后查看是否起作用。

    我在使用vs 2005的时候遇到了这个问题,但人们希望微软现在已经解决了这个特定的问题。


    在我的例子中,我复制了一个类库,但没有更改项目属性中的"程序集名称",所以一个dll正在覆盖另一个dll…


    对于原始海报,此问题已得到解答,但如果有人在MS测试项目中遇到此问题:

    在Visual Studio中,单击"测试"菜单->测试设置->默认处理器体系结构,并确保体系结构与要引用的其他程序集的体系结构匹配。如果另一个程序集是x64,而测试设置是x86,则可能会遇到原始海报的症状。


    疯子。我知道。

    在这里尝试了所有选项。重新启动、清理、手动签入生成的DLL(这对于理解是否真的是你自己造成的混乱是无价的)。

    我通过在选项中将msbuild的冗长设置为"detailed"来实现这一点。


    在我的例子中,我只在vs 2015中得到了错误。在vs 2017中打开项目时,错误消失了。


    我遇到了类似的问题,即在执行期间找不到名称空间/方法,尽管在编译期间它很好,但原因似乎是我所引用的程序集被部署到了GAC,从那时起就被更改了,所以当我在Visual Studion中引用程序集时,它使用的是最新的程序集,但在运行时已经使用了GAC的版本。