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