【问题标题】:.NET dll dependencies not working as expected.NET dll 依赖项未按预期工作
【发布时间】:2015-05-22 19:06:50
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    是的,根据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。结果 使用 @987654331 @class 要求 GUI.DLL 存在。

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

    【讨论】:

    • 在您的解释中,您似乎混淆了 area() 和 draw() 函数。我的应用实际上调用了不依赖于 GUI 的 area(),因此 JIT 工作正常,但我想我明白了。
    • @SimonBudin 你能澄清一下哪个部分令人困惑吗?我不确定为什么谈论 area 方法与 GUI.DLL 相关会更有趣(因为 area 方法不应该带来比使用 Rectangle 类型本身更多的依赖关系)。
    • ComputationalGeometry 应用程序不需要在 Rectangle 程序集中使用 draw() 并且可以在没有 GUI.dll 存在的情况下正常工作。 Bob 大叔的说法在 .NET 中似乎暗示了相反的意思,即“ComputationalGeometry 需要 GUI.dll 才能正常运行”,这实际上是错误的。
    • 在我的示例中, Rectangle.draw() 方法实际上直接将调用委托给 GUI 程序集,这不是您所说的。
    • @SimonBudin stackoverflow.com/questions/2206321/… 尤其是从那里链接的informit.com/articles/article.aspx?p=30601&seqNum=5 是其中之一。您还可以阅读类似 How CLR Creates runtime objects 的内容,其中涉及该主题。 blogs.msdn.com/b/suzcook 很好(尽管 10 岁以上)如果您想更深入地阅读有关加载/查找程序集的主题。
    猜你喜欢
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多