C# 为什么名称空间不被识别?

C# 为什么名称空间不被识别?,c#,.net,namespaces,C#,.net,Namespaces,我有一个叫做Tools的解决方案,其中有三个项目;工具、PerecentageBar、MessageBox。每个项目都是工具程序集的一部分。[在每个项目的属性页中,我已将程序集名称设置为MyCompany.Tools.Controls] 我在项目中拥有以下工具: namespace MyCompany.Tools.Controls { public class MyPictureBox : PictureBox {} } 在MessageBox项目中 namespace

我有一个叫做Tools的解决方案,其中有三个项目;工具、PerecentageBar、MessageBox。每个项目都是工具程序集的一部分。[在每个项目的属性页中,我已将程序集名称设置为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个项目构建到一个组件中。每个都必须构建自己的程序集-然后我必须使用合并工具将它们合并到一个程序集中

使用
using
指令

因此,在您的情况下,应该是:
使用MyCompany.Tools
——这与其他使用源文件中自动生成的语句的情况一样


编辑:尝试使用Controls=MyCompany.Tools.Controls。我通常不会在代码中使用别名引用名称空间,除非我必须这样做,但我认为这应该是可行的。

使用
using
指令

因此,在您的情况下,应该是:
使用MyCompany.Tools
——这与其他使用源文件中自动生成的语句的情况一样


编辑:尝试使用Controls=MyCompany.Tools.Controls。我通常不会在代码中使用别名引用名称空间,除非我必须这样做,但我认为这应该是可行的。

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

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

名称空间不会在引用边界上导出。仅限类型(和函数)。为了“查看”MyCompany命名空间,您需要在该命名空间的正下方添加一个类型(类)。

命名空间不会在引用边界上导出。仅限类型(和函数)。为了“查看”MyCompany名称空间,您需要在名称空间的正下方添加一个类型(一个类)。

编辑-根据您的后续评论,我冒昧地猜测一下错误:

Assembly1在命名空间
MyCompany.Tools.Controls
中定义类
MyMessageBox

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

namespace Controls {
    public class MyControl {
        // ...
    }
}
Assembly3引用已编译的Assembly2

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

如果我猜对了,您应该在
MyCompany.Tools.Controls
命名空间中向Assembly2添加一个类型。这将使顶级命名空间对Assembly3可见

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


这看起来应该是可行的(在我的测试中也是如此)。同时,尝试将其更改为:

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

这应该没有什么区别,但在C#中定义嵌套名称空间是一种更为惯用的方法。

Edit-根据您的后续评论,我将冒昧地猜测出错误:

Assembly1在命名空间
MyCompany.Tools.Controls
中定义类
MyMessageBox

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

namespace Controls {
    public class MyControl {
        // ...
    }
}
Assembly3引用已编译的Assembly2

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

如果我猜对了,您应该在
MyCompany.Tools.Controls
命名空间中向Assembly2添加一个类型