假设我的库类(在程序集A中)有一个方法GetFoo()
返回一个类型Foo
。 Foo
实现了几个接口,包括程序集B中的IBar
。当客户端代码调用GetFoo()
(客户端代码不引用程序集B)时,编译器将给出错误,因为{{ 1}}“在未引用的程序集中定义。必须添加对程序集B的引用”。请注意,我的代码只需要了解Foo,它不包含对接口的引用。
是否可以不参考B?据我所知,运行时无需了解它。
答案 0 :(得分:4)
运行时需要接口,需要组装B.
如果调用者实际上不关心接口,您可以选择不实现它,然后不需要程序集b。如果有时需要它,有时则不需要,可以使用#if
指令和编译器标志来创建两个版本的程序集a,一个使用b而另一个不使用。虽然有两个版本,但IMO的做法有点过分了。
答案 1 :(得分:3)
该场景适用于C ++等本地语言,因为接口只是指定了一个在编译时检查但在运行时不强制执行的约定。但是,在.NET中,CLR在运行时强制执行类型安全性,因此需要引用定义接口的程序集。
如果您的情况允许,您可能希望将界面分解为单独的“合同”程序集,并让两个程序集都引用它。它将是一个非常小的组件,应该非常快速地加载。
答案 2 :(得分:1)
不,如果您正在处理实现某些接口的类,那么所有这些接口都应该可用于您创建或检索类的位置。
通常这会以相反的方式解决,你对接口而不是具体的类工作,那么你只需要添加对接口程序集的引用而不是类。