.NET dll依赖项无法按预期工作

时间:2015-03-19 15:19:11

标签: c# .net deployment dependencies .net-assembly

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

enter image description here

为了证明他的观点,Bob叔叔说:“在.NET中,必须使用计算几何应用程序构建和部署GUI程序集。”因此我们必须将Rectangle分解为两个不同的实体等等。

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

enter image description here

对我而言,Bob叔叔意味着如果ComputationalGeometry是一个控制台应用程序,除非与Rectangle.dll GUI.dll放在同一目录中,否则它不应该运行,对吗?

事实上,我的Computational Geometry Application在可执行文件目录中运行时没有GUI.dll。没有Rectangle.dll就会崩溃,这很明显。所以.NET非常聪明,并且知道ComputationalGeometry应用程序不会调用draw()函数。

鲍勃叔叔错了吗? 有人可以解释我在这里缺少的一点吗?

1 个答案:

答案 0 :(得分:1)

是的,基于draw()方法签名,如果实际上没有调用方法,则需要GUI.dll的语句是错误的。

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

这就是你的情况 - 你有draw()方法签名不依赖于GUI.DLL和方法没有被调用。由于您的代码没有调用该方法,因此没有请求JIT它,因此不需要加载该方法的 body 使用的类型。因此,GUI文件夹中不需要存在GUI.DLL。

  // 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类要求GUI.DLL存在。

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