我有一个函数,我想确保它是编译的 JIT(即在它被调用之前)。是否有可以确保这一点的属性或程序集设置?如果不是,那我怎么能保证一个函数是 JIT 编译的呢?
谢谢!
编辑:
我想这样做是为了防止我的应用程序由于缺少引用的程序集而崩溃。如果我的函数是 JIT 编译的,我可以将引用缺失程序集的函数调用包装在 try...catch 块中并优雅地处理这种情况。
据我了解,有时整个类(甚至整个应用程序)可能会被 Jitted - 这会导致我无法捕捉到的错误。
我有一个函数,我想确保它是编译的 JIT(即在它被调用之前)。是否有可以确保这一点的属性或程序集设置?如果不是,那我怎么能保证一个函数是 JIT 编译的呢?
谢谢!
编辑:
我想这样做是为了防止我的应用程序由于缺少引用的程序集而崩溃。如果我的函数是 JIT 编译的,我可以将引用缺失程序集的函数调用包装在 try...catch 块中并优雅地处理这种情况。
据我了解,有时整个类(甚至整个应用程序)可能会被 Jitted - 这会导致我无法捕捉到的错误。
如果我没看错,你会担心第一次编译类/方法时会发生错误。这需要对边界的认识。它可以通过额外的层获得。
如果 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。
我可能回答错了问题,但看起来您主要希望能够拦截程序集加载失败(整个类被 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...
}
这样做的缺点是你不能做很多事情,除了在其他地方寻找程序集(或记录错误)。这种捕获负载故障的方式不提供解决失败时的特定和优雅的逻辑。
这是您的应用程序需要自己解决的问题,还是您现在正在调试某种程序集加载问题?
如果是后者,请查看融合日志。这是由在运行时探测和加载程序集的子系统生成的日志。
这是一篇文章:http ://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx