0

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

谢谢!

编辑:

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

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

4

3 回答 3

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。

于 2009-06-01T16:21:30.023 回答
0

我可能回答错了问题,但看起来您主要希望能够拦截程序集加载失败(整个类被 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...
}

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

于 2009-06-01T16:16:53.237 回答
0

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

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

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

于 2009-06-01T18:47:13.473 回答