.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);
}
我正在阅读 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);
}