【问题标题】:JIT compiling with missing assembly references缺少程序集引用的 JIT 编译
【发布时间】: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


【解决方案1】:

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

从方法 A 调用它。

所以:

public void MethodA()
{
    try
    {
        MethodAImpl();
    }
    finally
    {
    }
}

【讨论】:

  • 这是我必须做的,但我想知道是否有鲜为人知的编译器提示。
【解决方案2】:

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

【讨论】:

  • 并非每个会接触代码的开发人员都了解反射
  • 对某些人来说,这只是一份工作——这对我来说很好。
猜你喜欢
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多