为什么名称空间无法识别?

时间:2009-10-15 13:34:17

标签: c# .net namespaces

我有一个名为Tools的解决方案,里面有三个项目;工具,PerecentageBar,MessageBox。这些项目中的每一个都是Tools程序集的一部分。[在每个属性页面中,我将AssemblyName设置为MyCompany.Tools.Controls]。

我有工具项目:

namespace MyCompany.Tools.Controls
{
     public class MyPictureBox : PictureBox
     {} 
}

在MessageBox项目中。

namespace MyCompany.Tools.Controls
{
     public class MyMessageBox : Form
     {} 
}

在PercentageBar项目中

namespace MyCompany.Tools.Controls
{
     public class PercentageBar: UserControl
     {} 
}

构建此解决方案并创建MyCompany.Tools.Controls.dll。

在另一个解决方案中,我有一个名为MapperTool的项目。

namespace MapperTool
{
    public class MapperToolFacade : IDisposable, IDiagService
    {}
}

在这个项目中,我添加了对上面的dll的引用,并添加了一个using语句:

using MyCompany.Tools.Controls;
然而,到目前为止一切都很好。在这个项目中,我只能“看到”并使用MyPictureBox和上面的using语句。其他类型MyMessageBox和PercentageBar不可用。

为什么会这样?

编辑: 调查显示其他类型存在于命名空间MyCompany.Tools.Controls下。但是,在类视图中查看它们未在MyCompany.Tools.Controls程序集中列出。相反,他们是这样组织的:

MyCompany.Tools.Controls                  (assembly)
    MyCompany.Tools.Controls              (namespace)
        MyPictureBox                      (type)

PercentageBar
    MyCompany.Tools.Controls
        PercentageBar

MyMessageBox
    MyCompany.Tools.Controls
        MyMessageBox

所以我想下一个问题是,如果我在每个项目中将程序集名称指定为MyCompany.Tools.Controls,为什么将后两个项目构建为具有不同名称的程序集? [输出目录中的dll确实有naem MyCompany.Tools.Controls.dll]

此外,我想在MyCompany.Tools.Controls命名空间中创建我的所有控件,并将它们构建到单个MyCompany.Tools.Controls程序集中,这样我就可以将此引用添加到需要使用它们的任何其他项目中。

从上面发生的情况看,我的MyCompany.Tools.Controls解决方案中的每个单独的工具项目都必须构建到一个唯一的程序集中,并且每个工具都必须单独引用...?

问题在于我对项目和装配的理解。似乎不可能将3个项目构建到一个程序集中。每个人都必须构建自己的程序集 - 然后我必须使用合并工具将它们组合成一个程序集。

5 个答案:

答案 0 :(得分:4)

使用using指令。

MSDN: using Directive (C#)

因此,在您的情况下,它将是:using MyCompany.Tools - 这与其他使用在源文件中自动生成的语句一起使用。

修改:尝试using Controls = MyCompany.Tools.Controls。我通常不会使用别名引用代码中的命名空间,除非我绝对必须这样做,但我认为这应该可行。

答案 1 :(得分:2)

您是否已将该程序集的引用添加到新项目中?

答案 2 :(得分:2)

命名空间不会通过参考边界导出。只有类型(和功能)。为了“看到”MyCompany命名空间,您需要在该命名空间的正下方添加一个类型(类)。

答案 3 :(得分:1)

编辑 - 根据您的后续评论,我会冒险猜测错误:

Assembly1 定义名称空间MyMessageBox中的类MyCompany.Tools.Controls

Assembly2 引用Assembly1并在命名空间Controls中定义至少一个类。也就是说,类声明如下所示:

namespace Controls {
    public class MyControl {
        // ...
    }
}

Assembly3 引用已编译的Assembly2。

如果是这种情况,Assembly3可以看到命名空间Controls但不能看到MyCompanyMyCompany.Tools,因为这些命名空间中没有一个被引用的程序集中的类使用。项目的默认命名空间它仅用于为新类文件创建默认值并为嵌入资源生成名称空间 - 除非您定义使用它的类型,否则它实际上不存在于程序集中。

如果我猜对了,你应该在MyCompany.Tools.Controls命名空间中为Assembly2添加一个类型。这将使Assembly3可以看到顶级名称空间。

如果Assembly2包含部分类MyMessageBox的其他部分,则需要在与其他部分相同的命名空间中声明它。


看起来它应该可以工作(并且在我的测试中)。在此期间,请尝试将其更改为:

namespace MyCompany.Tools.Controls
{
    public partial class MyMessageBox : Form {}
}

它应该没有任何区别,但在C#中定义嵌套命名空间是一种更惯用的方法。

答案 4 :(得分:0)

为了帮助解决问题,您可以使用Visual Studio中的类资源管理器来检查该类所在的命名空间。我首先要验证MyMessageBox实际上是您认为的命名空间。

然后,如果它符合预期,你应该专注于你的第二个项目。你的另一个类在MyCompany.Tools命名空间内吗?它是偶然的,声明类名称MyCompany或Tools(如果本地类与导入的命名空间冲突,visual studio可能会跳闸)。