如果不引用所有依赖项,可以使用 class 库吗?

Can you use a class library if you don't reference all of it's dependencies?

让我澄清一下:

我已经构建了一个 class 库用于多个项目。作为此 DLL 的一部分,我想通过扩展 CookieAuthenticationProvider 为 Owin Cookies 添加一些不同的自定义提供程序,因此我需要包含对 Microsoft.Owin.Security.Cookies 的引用。这是安全的,因为将使用我的库的较新项目也使用 Microsoft.Owin.Security.Cookies.

然而,有些项目较旧并且不使用 Owin 等...如果我包含该库以供其他用途,它们会崩溃吗?或者他们只会在我尝试使用提供者时崩溃(我不会,因为他们不能使用它)。

我想将一些常用的东西放在我的库中,而不必将它的每一个依赖 DLL 引用到使用它们的每个项目。我很确定我正在做的事情没问题,但我希望在我浪费很多时间之前有人能告诉我。另外,如果有更好的方法,我会洗耳恭听。

规则:

  • 所有对给定程序集可见的类型都必须在该程序集引用的程序集中声明。

    只要您的 class 库实际上 在其 public API 中公开 Microsoft.Owin.Security.Cookies 程序集中找到的类型,然后其他程序集可以安全地使用您的 DLL 进行编译而无需引用该程序集。

  • 引用的程序集不需要在运行时存在,除非实际需要该程序集中的代码,即一些其他代码试图调用该代码。

    general 中,这意味着只要引用您的程序集和未引用 Microsoft.Owin.Security.Cookies 的其他程序集也不调用您的程序集中的任何代码,那么依次尝试调用 Microsoft.Owin.Security.Cookies 中的代码,该程序集不需要在运行时出现。

第二点的棘手部分是 "calling code in Microsoft.Owin.Security.Cookies" 的构成并不总是很清楚。通常,只要您根本不访问程序集中的类型,.NET 就不会尝试执行该程序集中的任何代码。但是不难意外访问这些类型,即使它们不是必需的(例如,在初始化程序中,static 或其他检查接口实现的代码等)。

如果您真的希望您的客户能够使用您的 DLL,它引用 Microsoft.Owin.Security.Cookies,而不必在运行时出现该 DLL,您需要非常小心以确保您已经完全支持这种情况。可以做到,但也不难犯错。


(我不得不承认,令我惊讶的是这个有用的问题还没有在 Stack Overflow 上得到解决。似乎它之前已经出现了。但是我找不到重复的问题,因此上面的答案。如果有人知道我忽略了一个副本,我欢迎任何适当的通知。)