如果你不使用类库,你能使用它吗;t引用所有内容';的依赖关系

本文关键字:关系 依赖 引用 类库 如果 | 更新日期: 2023-09-27 18:21:48

让我澄清一下:

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

然而,有些项目是旧的,不使用Owin等…如果我把库包括在内用于其他用途,它们会爆炸吗?或者只有当我尝试使用该提供商时,它们才会爆炸吗(我不会,因为他们无法使用它)。

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

如果你不使用类库,你能使用它吗;t引用所有内容';的依赖关系

规则:

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

    只要您的类库没有在其公共API中公开Microsoft.Owin.Security.Cookies程序集中的类型,那么其他程序集就可以安全地使用您的DLL编译,而无需引用该程序集

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

    general中,这意味着只要引用程序集且不引用Microsoft.Owin.Security.Cookies的其他程序集也不调用程序集中的任何代码,而这些代码又会尝试调用Microsoft.Owin.Security.Cookies中的代码,那么该程序集就不需要在运行时存在

第二点的棘手之处在于,"Microsoft.Owin.Security.Cookies中的调用代码"的构成并不总是很清楚。通常,只要您根本不访问程序集中的类型,.NET就不会尝试执行该程序集中的任何代码。但是,即使在不一定需要的情况下(例如,在初始化程序、static或其他代码中,检查接口实现的代码等),也不难意外访问这些类型

如果您真的希望您的客户端能够使用引用Microsoft.Owin.Security.Cookies的DLL,而不必在运行时出现该DLL,那么您需要非常小心,以确保您完全支持该场景。这是可能的,但犯错误也不难。


(我不得不承认,我很惊讶这个有用的问题还没有在Stack Overflow上得到解决。到目前为止,这个问题似乎以前就已经出现过了。但我找不到副本,因此给出了上面的答案。如果有人知道我忽略了一个副本,我欢迎任何合适的通知。)