【发布时间】:2010-02-25 14:29:27
【问题描述】:
我遇到了一个有趣的问题。我有一个由几个程序集组成的应用程序。我安装了应用程序,但忘记了一个小的非必要程序集。该应用程序似乎可以启动并正常工作,直到我找到需要使用该程序集的方法。您可能已经猜到了,我看到了"Could not load file or assembly 'Blah, Version=1.0.0.0, Culture=neutral, PublicKeyToken=Blah' or one of its dependencies. The system cannot find the file specified." 异常。
这不足为奇吧?是的,安装程序可以修复,我的问题就消失了,但我想看看是否有一种编程方式来做到这一点。所以我尝试将使用非必要程序集的代码包装在 try 块中,并在 finally 块中释放昂贵的资源,如下所示:
public void MethodA()
{
try
{
// Do stuff with non essential assembly
}
finally
{
// Release expensive resource here
}
}
认为 JIT 编译器将从 try 块中抛出,最终将控制权返回给 finally 块,并且我的资源被释放。事实证明,JIT 编译器会在调用方法时抛出异常。
我曾考虑在调用链中将 finally 块移到更高的位置,但是这个方法正在从数百个地方调用。我曾想过将 Assembly.Load 用于非必要的程序集,但不得不使用反射的想法让我觉得很脏。
有没有办法让 finally 块在这种情况下执行而不需要进行太多重组或不必洗澡,我的意思是,使用反射?
【问题讨论】:
-
您为非破坏性单元测试在已安装的应用程序中交付(和可测试)提供了一个很好的论据。
标签: .net assemblies jit