【问题标题】:Can you use a class library if you don't reference all of it's dependencies?如果您不引用所有依赖项,您可以使用类库吗?
【发布时间】:2016-02-15 13:43:07
【问题描述】:

让我澄清一下:

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

但是有些项目比较老,不使用 Owin 等...如果我将库包含在其他用途​​中,它们会爆炸吗?或者他们只会在我尝试使用提供程序时才会爆炸(我不会因为他们无法使用它)。

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

【问题讨论】:

  • 是的,但略有不同。我只想在这个 DLL 中包含对 3rd 方事物的引用的事物。我要问的是,如果我在另一个应用程序中使用它而不引用它的依赖项,它是否总是会爆炸,或者只有在应用程序中我尝试从使用我拥有的那些依赖项之一的库中访问某些内容时才会爆炸'不添加对的引用。
  • afaik 程序集定义了它们的依赖关系,Visual Studio 解决了这些依赖关系。如果找不到该依赖树的 dll,VS 将在编译时抱怨

标签: c# .net dll owin class-library


【解决方案1】:

规则:

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

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

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

    一般中,这意味着只要引用您的程序集且未引用 Microsoft.Owin.Security.Cookies 的其他程序集也不调用您的程序集中的任何代码,然后这些代码将依次尝试调用Microsoft.Owin.Security.Cookies 中的代码,该程序集不需要在运行时出现。

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

如果您真的希望您的客户能够使用引用 Microsoft.Owin.Security.Cookies 的 DLL,而不必在运行时存在该 DLL,则需要非常小心以确保您完全支持该方案.有可能,但犯错也不难。


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

【讨论】:

    猜你喜欢
    • 2021-08-13
    • 2014-11-15
    • 1970-01-01
    • 2020-07-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2012-07-19
    相关资源
    最近更新 更多