让我澄清一下:
我已经构建了一个类库以用于多个项目。作为此 DLL 的一部分,我想通过扩展 CookieAuthenticationProvider 为 Owin Cookies 添加一些不同的自定义提供程序,因此我需要包含对 Microsoft.Owin.Security.Cookies 的引用。这是安全的,因为将使用我的库的新项目也使用 Microsoft.Owin.Security.Cookies。
然而,有些项目较旧并且不使用 Owin 等...如果我包含该库以供其他用途,它们会爆炸吗?或者他们只会在我尝试使用提供程序时崩溃(我不会这样做,因为他们无法使用它)。
我想将一些常用的东西放在我的库中,而不必将它的每个依赖 DLL 引用到使用它们的每个项目。我很确定我正在做的事情没问题,但我希望在我浪费很多时间之前有人能告诉我。另外,如果有更好的方法,我会洗耳恭听。
最佳答案
规则:
- 所有对给定程序集可见的类型都必须在该程序集引用的程序集中声明。
只要您的类库实际上没有公开在其公共(public)API 在Microsoft.Owin.Security.Cookies
程序集中找到的类型,然后其他程序集可以安全地使用您的 DLL 进行编译,而无需引用该程序集。 - 引用的程序集不需要在运行时出现,除非实际需要该程序集中的代码,即一些其他代码试图调用该代码。
一般,这意味着只要引用您的程序集和不引用Microsoft.Owin.Security.Cookies
的其他程序集也不调用任何代码在您的程序集中,然后将依次尝试调用Microsoft.Owin.Security.Cookies
中的代码,该程序集不需要在运行时出现。
关于第二点的棘手部分是什么构成“Microsoft.Owin.Security.Cookies
中的调用代码”并不总是很清楚。通常,只要您根本不访问程序集中的类型,.NET 就不会尝试执行该程序集中的任何代码。但不难意外访问这些类型,即使它们不是必需的(例如,在初始化程序中,static
或其他检查接口(interface)实现的代码等)。
如果您真的希望您的客户能够使用您的 DLL,它引用 Microsoft.Owin.Security.Cookies
,而不必在运行时出现该 DLL,您将需要非常小心以确保您完全支持该场景。这是可能的,但也不难犯错误。
(我不得不承认,令我惊讶的是这个有用的问题还没有在 Stack Overflow 上得到解决。似乎它之前已经出现了。但我无法找到重复项,因此答案上面。如果有人知道我忽略了一个副本,我欢迎任何适当的通知。)
关于c# - 如果你不引用它的所有依赖项,你可以使用类库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33701839/