强制包含对dll的引用

时间:2012-06-25 14:05:16

标签: c# .net namespaces

场景:ProjectA参考ProjectB,ProjectB引用ProjectC

我在ProjectC中定义了一个接口

namespace Cmp.Product.Family.Configuration.Container
{
  public interface IComponent
  {
    // a couple of methods
  }
}

在ProjectB中(ProjectB依赖于ProjectC)我这样做:

using Cmp.Product.Family.Configuration.Container;

namespace Cmp.Product.Family.UI
{
    public interface IPublicComponent :  IComponent
    {

    }
}

到目前为止一切顺利。但问题是ProjectA无法编译。

抱怨

  

未定义Cmp.Product.Family.Configuration.Container.IComponent。添加对ProjectC的引用。

我不明白为什么我需要添加对ProjectC的引用。我仍然没有在ProjectA中使用IPublicComponent

我无法在较小的复制品上重现此问题。有没有办法从C#编译器获得详细的输出?

提示:ProjectA中出现问题的类是嵌套命名空间(namespace Cmp.Product.Family.UI.Settings)。如果我在IPublicComponent的定义中更改名称空间,问题就会消失。

编辑:

如果我从:

更改包含IPublicComponent的名称
 Cmp.Product.Family.UI

到:

 Cmp.Product.Family.SomethingElse

有帮助。知道ProjectA中问题所在的类是此命名空间中的容器:

Cmp.Product.Family.UI.Settings

3 个答案:

答案 0 :(得分:4)

ProjectA需要ProjectC,因为A需要B,而B公开有关C的公共类型信息.B中有一个公共接口,它继承了C中的接口。

如果没有A引用C,A就不知道B的超类型是什么。 .NET的元数据方案需要该信息。

以下是如何重现问题的一个非常简单的示例。假设我使用了项目B&的确切代码。 C,这在项目A中将重现问题:

namespace ProjectA
{
    public class Class1
    {
        private IPublicComponent d = null;
    }
}

答案 1 :(得分:0)

这是因为项目B依赖于项目C中定义的接口。因此,当您添加对项目B的引用时,.Net框架会识别该类在项目C中实现接口,但它不理解它,因此对于框架来“理解”接口,并因此编译项目B,它需要知道项目C中的接口是什么。

答案 2 :(得分:0)

说你有这个:

ProjectC.ClassC1
ProjectB.ClassB1
ProjectB.ClassB2 : ProjectC.ClassC1

如果您的ProjectA使用ProjectB中的任何内容,则显然需要至少引用ProjectB。例如,如果ProjectA使用ProjectB.ClassB1,您只需要引用ProjectB。但必须在此方案中引用ProjectC。但如果在ProjectA中使用ProjectB.ClassB2(继承/实现/使用ProjectC.ClassC1),您也必须引用ProjectC

因此,如果您的ProjectA无法编译,则代码中的某处会使用ProjectB中的代码,而代码会使用ProjectC中的代码。

我自己刚刚测试过。希望这会有所帮助。

修改

如果您仍然存在参考问题,则可能是引用损坏或其他错误。尝试删除并重新添加引用。另请查看项目的源xml文件。最后,您可以尝试通过将项目创建为新项目并将所有现有文件添加到项目中来重新创建项目。