【问题标题】:Is there any way to ensure a function is compiled JIT?有什么方法可以确保函数是 JIT 编译的?
【发布时间】:2009-06-02 02:47:13
【问题描述】:

我有一个函数,我想确保它是 JIT 编译的(即在它被调用之前)。是否有可以确保这一点的属性或程序集设置?如果不是,那如何保证一个函数是JIT编译的?

谢谢!

编辑:

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

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

【问题讨论】:

  • 你到底为什么要这么做?
  • 想听这个,一定很好听。

标签: c# compilation jit


【解决方案1】:

如果我没看错的话,你会担心第一次编译类/方法时会发生错误。这需要对边界的认识。它可以通过额外的层获得。

如果 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。

【讨论】:

    【解决方案2】:

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

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

    static void Main()
    {
        AppDomain.CurrentDomain.AssemblyResolve += OnResolveFailure;
        //...
    }
    
    static Assembly OnResolveFailure(object sender, ResolveEventArgs args)
    {
        //Do something here...
    }
    

    这样做的缺点是你不能做很多事情,除了在其他地方寻找程序集(或记录错误)。这种捕获加载失败的方式不提供解决失败时的具体和优雅的逻辑。

    【讨论】:

    • 我也尝试过类似的方法,但是,正如您所说,除了记录错误之外,我无能为力。能够将函数调用包装在 try...catch 中(我现在正在这样做,而且效果非常好),而不必担心我所依赖的机制(JIT 编译)会失败是我的目标。谢谢!!
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-11
      • 1970-01-01
      • 2020-06-20
      • 2011-05-01
      • 1970-01-01
      • 2011-02-23
      • 2015-03-03
      • 2015-09-23
      • 1970-01-01
      相关资源
      最近更新 更多