如何通过类库正确解决DLL引用,而无需将引用添加到调用项目中。

3
TL:DR 如何在类库中只引用程序集而不是引用库和调用项目?
我正在使用C#构建实用程序库以促进代码重用。在本例中,我想要做一些关于TFS服务器的事情,并需要引用来自TFS方面的几个程序集:
Microsoft.TeamFoundation.Client Microsoft.VersionControl.Client Microsoft.WorkItemTracking.Client
我在名为Utility的类库中包含这些引用。然后,我继续在那些程序集中封装帮助对象。没有错误,智能感知正常运行等等。
当我想在同一解决方案内的另一个项目(例如TestCLI)中使用该类库时,我通过选择解决方案引用选项卡中的项目添加对Utility项目的引用。然后我可以使用Utility类而没有问题,直到我去构建。
当我构建解决方案时,它会抛出类似于以下错误的错误:
The type 'Microsoft.TeamFoundation.VersionControl.Client.BranchObject' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.TeamFoundation.VersionControl.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
过去,我解决了这个问题,方法是将相同的引用添加到调用项目(TestCLI)以及类库(Utility)中。我觉得这违背了拥有类库的目的之一,并且我错过了一步,以便无需担心调用项目中的库引用。
有没有什么方法可以解决这些依赖关系而不包括在类库和调用项目中添加引用?我是否将解决方案结构化不正确?我是否以不正确的方式考虑了类库?

2
如果发生这种情况,那是因为你的库直接暴露了其他库的类或方法,这就是为什么需要引用的原因。如果你完全隐藏其他库的对象,就不需要对它们进行引用。 - Gusman
现在我感觉自己真是个白痴。这样比它坏掉要合理得多。我还有一些工作要做来解决这些变化。你知道是否有一种方法可以嵌入这些引用,以便即使我想使用其中的一些对象,也可以不引用它们吗?另外,如果你愿意,请写一个答案,我会接受它。否则,我可以自己写一个,确保有所收获。 - Gilbrilthor
嗯,你根本无法暴露对象,但你可以封装它们,这取决于你要暴露什么。如果它们是数据类,你可以在你的库中创建该类的副本;如果它们是函数,你可以为它们创建一个包装器。 - Gusman
太棒了。谢谢你向我解释那个。 - Gilbrilthor
1个回答

2

需要引用是因为你要从其他库中公开对象,而使用这些类的最终程序需要这些引用。

为了避免这种情况,你必须通过包装器、类的副本或其他方式来隐藏外部对象,这取决于你公开这些对象的原因和目的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接