2010-02-18 154 views
16

我有一个c#解决方案,它由许多项目组成。C#项目参考的问题

我有一个项目,是我的baseassemblies持有其他项目中使用的所有公共信息。所有其他项目都引用了基本程序集。然而

我加入我的baseassemblies一个dll引用的所有其他项目无法看到它。

我怎样才能让这个其他的项目可以看到,baseassemblies被引用的DLL?我不想将DLL添加到所有项目,因为这会破坏我的baseassemblies项目的目的。

回答

23

正确的做法是为您的其他组件就是不用其他DLL的参考。正确地做到这一点的方法是不让基本程序集公开该DLL中的任何类型。将所需的所有功能封装在基本程序集中,并确保使用基本程序集的人员无需知道底层dll的基本程序集正在使用。否则,每个将引用基本程序集的项目,如果他们需要使用该dll中包含的内容,他们将不得不引用它。

+2

+1你打我吧。我同意100% – 2010-02-18 16:18:37

+2

在许多情况下,这对大型代码库并不实用。这是一个很好的“理论”答案,但它需要编码和测试方面的额外努力才能使其发生(经常)不增值。我并不是说它当然是不适合的...... – 2010-12-06 17:05:38

9

在.NET中没有传递引用。如果程序集需要引用另一个引用,它必须直接这样做,它不能“继承”来自另一个引用的引用。

注意,项目只需要引用它直接使用类型的组件。如果A使用B,B使用C,但A不直接使用C,那么A只需要直接引用B(加载器将处理B引用C)。

3

总之,你不能这样做。您需要添加对包含您要使用的代码的DLL的引用,否则它将无法看到它。

我的建议是建立在你的“BaseAssemblies”项目的一层,你可以从你的应用程序基本上创建了一个分层架构访问。

例如

应用层 - 使用IDataClass
业务逻辑层 - 定义IDataClass
数据访问层 - MyRawDataClass(实现IDataClass)

从例如,应用层只需要一个参考到BAL以便能够与DAL交互。

0

你可以有必须由你的“其他” DLL中实现你的BaseAssemblies导出接口。另外,您的BaseAssemblies需要这些类的一些“类工厂”功能。

0

其他海报是正确的:你不能这样做。这是恕我直言,Visual Studio的可悲。 “使”处理这种清洁在20年前的馅饼...

0

在有些情况下你的项目是指一个实例这反过来又指B,而当你建立,B并不总是出现在bin文件夹,你只知道这是代码运行时的情况。有一个相关的SO问题HERE。人们用奇怪的方式解决了这个问题,但我特别喜欢约翰亨特的解决方案。这SO thread还讨论了在您使用生成事件来达到理想的效果的解决方案。