【问题标题】:.Net Core - Are dependencies resolved on assembly loading?.Net Core - 程序集加载是否解决了依赖关系?
【发布时间】:2017-09-20 17:33:30
【问题描述】:

想象一下,在您的库 A 中,您声明了对库 B 的永远不会使用的依赖项。

如果你尝试动态加载A并且B不在身边,你的应用程序会崩溃吗?或者,只要您调用的方法不尝试访问 B 上的代码,您就清楚了吗?

【问题讨论】:

  • 当即时编译器需要程序集时,依赖关系由 CLR 解析。所以不行。顺便说一句,“从不使用”通常不会被正确判断。但你会发现的。

标签: c# .net-core .net-assembly


【解决方案1】:

这取决于您所说的“从不使用”。

  1. 用于编译库 A 的代码从不使用库 B 定义的任何 API。
  2. 库 A 中的代码使用库 B 定义的 API,但在运行时从不调用使用该 API 的代码路径。

在情况 1 中,编译器将在生成 libraryA.dll 时修剪未使用的引用。您不需要 libraryB.dll 并且运行时不会尝试加载它。

在第 2 种情况下,您可能没问题,但不能保证。例如,如果您有一个引用 libraryB 的类,即使该引用来自您从未调用过的方法,运行时仍可能会尝试加载 libraryB.dll。您有时可以巧妙地构建代码来避免这种负载,但您是在玩火。最好有 libraryB 可用。

【讨论】:

  • 我的是第二种情况......这就是我打算做的事情:强制开发人员声明一个公共方法,该方法返回应该在运行时加载的依赖项列表......
  • 顺便说一句,您可以通过直接从 .dll 文件中读取引用表来获取所有可能的引用程序集的列表。请参阅 System.Reflection.Metadata。例如:docs.microsoft.com/en-us/dotnet/api/…
  • 你是个天才!非常感谢!
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
相关资源
最近更新 更多