方案: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

我无法在较小的repro上重现此问题。有没有办法让C#编译器输出详细信息?

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

编辑:

如果我从以下位置更改包含IPublicComponent的名称:

 Cmp.Product.Family.UI


至 :

 Cmp.Product.Family.SomethingElse


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

Cmp.Product.Family.UI.Settings

最佳答案

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;
    }
}

关于c# - 强制包含对dll的引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11190855/

10-10 16:22