1

我遇到了一个有趣的问题。我有一个由几个程序集组成的应用程序。我安装了应用程序,但忘记了一个小的非必要程序集。该应用程序似乎可以启动并正常工作,直到我找到需要使用该程序集的方法。正如您可能已经猜到的那样,我看到了"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 块在这种情况下执行而无需过多重组或不必洗澡,我的意思是,使用反射?

4

2 回答 2

1

定义另一种方法,用非必要的程序集完成您的工作。

从方法 A 调用它。

所以:

public void MethodA()
{
    try
    {
        MethodAImpl();
    }
    finally
    {
    }
}
于 2010-02-25T02:25:49.967 回答
1

如果程序集不是必需的,则使用程序集加载没有问题。我不明白你为什么认为它很脏。反射只是 .NET 的另一个方面

于 2010-02-25T02:26:12.220 回答