C# 由于接口的原因,是否可以删除DLL依赖项?

C# 由于接口的原因,是否可以删除DLL依赖项?,c#,.net,interface,reference,C#,.net,Interface,Reference,假设我的库类(在程序集A中)有一个方法GetFoo()返回一个类型FooFoo实现多个接口,包括程序集B中的IBar。当客户端代码调用GetFoo()(客户端代码不引用程序集B)时,编译器将给出错误,因为IBar“是在未引用的程序集中定义的。必须添加对程序集B的引用”。请注意,我的代码只需要了解Foo,它不包含对接口的引用 是否有可能不必参考B?据我所知,运行时不需要了解它。运行时需要接口,需要程序集B 如果调用方实际上不关心接口,那么您可以选择不实现它,然后不需要程序集b。如果有时需要,有时不

假设我的库类(在程序集A中)有一个方法
GetFoo()
返回一个类型
Foo
Foo
实现多个接口,包括程序集B中的
IBar
。当客户端代码调用
GetFoo()
(客户端代码不引用程序集B)时,编译器将给出错误,因为
IBar
“是在未引用的程序集中定义的。必须添加对程序集B的引用”。请注意,我的代码只需要了解Foo,它不包含对接口的引用


是否有可能不必参考B?据我所知,运行时不需要了解它。

运行时需要接口,需要程序集B


如果调用方实际上不关心接口,那么您可以选择不实现它,然后不需要程序集b。如果有时需要,有时不需要,可以使用
#If
指令和编译器标志创建程序集a的两个版本,一个使用b,另一个不使用。虽然C++有COM的本地语言,但它只是简单地指定了一个约定,该约定在编译时检查,但在运行时不强制执行。但是,在.NET中,CLR在运行时强制执行类型安全,因此它需要引用定义接口的程序集


如果您的情况允许,您可能希望将接口拆分为一个单独的“契约”程序集,并让两个程序集都引用它。它将是一个非常小的程序集,加载速度应该非常快。

不,如果您处理的是实现某些接口的类,那么所有这些接口都应该可用于创建或检索类的位置


通常情况下,这是以另一种方式解决的,您使用的是接口而不是具体的类,然后您只添加对接口程序集的引用,而不是对类的引用。

只是好奇,这是您的实际姓氏?确实如此。我最近意识到很多人认为我是个聪明人,但这是我的名字。合同汇编+1。我们在所有的应用程序中都这样做,用于接口和值对象。这是一个很好的做法。