3

场景: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 的引用。我仍然没有使用IPublicComponentProjectA 中的。

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

提示:问题出现在 ProjectA 中的类是一个嵌套命名空间 ( namespace Cmp.Product.Family.UI.Settings)。如果我更改IPublicComponent.

编辑 :

如果我将包含 IPublicComponent 的名称从:

 Cmp.Product.Family.UI

至 :

 Cmp.Product.Family.SomethingElse

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

Cmp.Product.Family.UI.Settings
4

3 回答 3

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;
    }
}
于 2012-06-25T14:13:22.850 回答
0

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

于 2012-06-25T14:15:13.373 回答
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 文件。作为最后一件事,您可以尝试通过将项目创建为新项目并将所有现有文件添加到其中来重新创建项目。

于 2012-06-25T17:11:10.280 回答