代码之家  ›  专栏  ›  技术社区  ›  Mark Carpenter

是否有任何方法可以确保函数是编译的jit?

  •  0
  • Mark Carpenter  · 技术社区  · 15 年前

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

    谢谢!

    编辑:

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

    我的理解是,有时整个类(甚至整个应用程序)可能会被抖动——这将导致一个我不可能捕捉到的错误。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Henk Holterman    15 年前

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

    如果suspecttype有问题(即未加载所需的程序集),则下面的try/catch将不起作用,因为scenario1()本身的抖动将失败。

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

    它可以重写为

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

    但是,根据乔恩·斯基特的评论,我不确定这是否适用于CFX。

        2
  •  0
  •   Yann Schwartz    15 年前

    我可能回答了错误的问题,但看起来您主要希望能够截获程序集加载失败(整个类都在抖动中击败了围绕调用的Try/Catch保护,但这是在方法调用周围使用显式保护的副作用)。

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

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

    这样做的缺点是,除了在其他地方查找程序集(或记录错误),您不能做太多的工作。当解决方案失败时,不提供这种捕获负载故障的方法,这是一种具体而优雅的逻辑。

        3
  •  0
  •   JMarsch    15 年前

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

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

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