有没有办法确保函数编译JIT?

时间:2009-06-01 15:51:23

标签: c# compilation jit

我有一个函数,我想确定是编译JIT(即在它被调用之前)。是否有属性或装配设置可以确保这一点?如果没有,那我怎样才能保证函数编译JIT?

谢谢!

修改

我想这样做是为了防止我的应用程序因缺少引用的程序集而崩溃。如果我的函数是编译JIT,我可以在try ... catch块中包装引用缺少的程序集的函数调用,并优雅地处理这种情况。

我的理解是,有时整个类(甚至整个应用程序)都可能被Jitted - 这会导致我无法捕获的错误。

3 个答案:

答案 0 :(得分:2)

如果我正确阅读了这一点,您会担心首次编译类/方法时发生的错误。这需要了解边界。它可以通过额外的层获得。

如果SuspectType出现'错误(即所需的程序集未加载),则下面的try / catch没有用,因为Scenario1()本身的Jitting将失败。

void Scenario1()
{
   try
   {
     var x = new SuspectType();
     ...
   }
   catch (..) { ... }    
}

可以改写为

void Scenario1a()
{
   try
   {
      Scenario1b();
   }
   catch (..) { ... }    

}

void Scenario1b()
{
     var x = new SuspectType();
     ...
}

但是,根据Jon Skeet的评论,我不确定这是否适用于CFx。

答案 1 :(得分:0)

我可能正在回答错误的问题,但看起来你主要是希望能够拦截程序集加载失败(整个类被JIT打败了围绕调用的try / catch防护,但这是使用显式防护的副作用方法调用)。

如果你想捕捉装配解决问题,而不是在每个可能的调用周围指定try / catch,你可以只听全局AssemblyResolve事件并响应程序集加载失败(我们在这里谈论.Net程序集) ,本机dll的加载失败必须使用不同的机制进行跟踪。)

static void Main()
{
    AppDomain.CurrentDomain.AssemblyResolve += OnResolveFailure;
    //...
}

static Assembly OnResolveFailure(object sender, ResolveEventArgs args)
{
    //Do something here...
}

这样做的缺点是除了在其他地方查找程序集(或记录错误)之外,你做不了多少。这种捕获负载故障的方法没有提供解决方案失败时的特定和优雅逻辑。

答案 2 :(得分:0)

这是您的应用程序需要能够自行解决的问题,还是您现在正在调试某种程序集负载问题?

如果是后者,请查看融合日志。这是由在运行时探测和加载程序集的子系统生成的日志。

这是一篇文章:http://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx