我有一个ASP.Net项目(ProjA)和一个类库项目(LibB)。我在库中创建了一个自定义类(ClassC),并添加了对现有dll(DllD)的引用。
我在ProjA中选择了Add reference选项,并从Solution选项卡中选择了LibB并添加了引用。
在ProjA中,我创建了一个ClassC实例。令我惊讶的是,它没有编译并向我显示错误:必须添加DllD作为我的ProjA的参考。
以下是信息:
类型“XXXX”在未引用的程序集中定义。您 必须添加对程序集'YYYYYY,Version = 1.0.0.0的引用, Culture = neutral,PublicKeyToken = xxxxxxx'。
嗯,XXX是ClassC的基础,并且在LibB项目中引用了dll。
那么LibB有什么意义呢?我不想将DllD添加到我的ProjA项目中,我只想在另一个项目中使用依赖于它的自定义类。
我必须添加这样的dll是正常的吗? 我应该设置什么来使我的LibB包含DllD dll?
答案 0 :(得分:5)
问题是,LibB
必须将DllD
中包含的某些类型公开给ProjA
中的代码。 1
如果它只是消耗幕后的那些类型,那么引用就没有必要了。但显然,这不是它的作用。因此,编译器希望引用能够完全理解LibB
中的类型和成员。
根据您的修改:
嗯,XXX是ClassC的基础,并且在LibB项目中引用了dll。
是的,编译器需要理解该类,包括它的所有基类。如果您使用了合成而不是继承,并且ClassC
只包含对XXX
实例的私有引用,则不需要引用。
1 最明显的方式是:
public class ClassC {
void DoSomething(SomeTypeFromDllD input){...}
}