.NET dll 依赖项未按预期工作

.NET dll dependencies not working as expected

我正在阅读 Uncle Bob 的 blog about SOLID principles,尤其是他的书中关于 SRP - 单一责任原则的摘录,并尝试使用真正的控制台应用程序来应用它。

为了证明他的观点,Bob 叔叔说:"In .NET the GUI assembly would have to be built and deployed with the computational geometry application." 所以我们必须将 Rectangle 分解成两个不同的实体,等等。

但为了确定,我想测试该语句并将这些对象中的每一个放入各自的程序集中。

对我来说,Bob 叔叔的意思是如果 ComputationalGeometry 是一个控制台应用程序,它不应该 运行 除非被放在与 Rectangle.dll 和 [=32= 相同的目录中] GUI.dll,对吧?

事实上,我的计算几何应用程序 运行 在可执行文件目录中没有 GUI.dll 的情况下完全没问题。它在没有 Rectangle.dll 的情况下崩溃,这是显而易见的。所以 .NET 相当聪明,知道 draw() 函数不是由 ComputationalGeometry 应用程序调用的。

鲍勃叔叔会错吗? 有人可以向我解释一下我在这里遗漏的要点吗?

是的,根据 draw() 方法签名,如果实际上未调用方法,则需要 GUI.dll 的声明是错误的。

如果所有程序集引用都在方法主体内,那么只要不调用方法(或更准确地说是 JITed),就不需要程序集。

这就是您的情况 - 您有 draw() 方法,其中 signature 不依赖于 GUI.DLL 并且未调用该方法。由于您的代码不调用该方法,因此没有对它进行 JIT 的请求,因此不需要加载该方法的 body 使用的类型。所以 GUI.DLL 不需要出现在 Bin 文件夹中。

  // method signature does not refer to Gui.
  void draw()
  {
      // Method body refers to Gui.
      Gui.Canvas.Default.DrawRectangle(1,2,3,4);
  } 

在更实际的情况下,draw 将具有某种 GUI 上下文的参数(如 draw(Gui.Canvas canvas),因此 Rectangle 类型本身将取决于 GUI.DLL。结果使用 Rectangle class 要求 GUI.DLL 存在。

  // method signature refers to Gui.
  void draw(Gui.Canvas canvas)
  {
      // Method body refers to Gui.
      canvas.DrawRectangle(1,2,3,4);
  }