C# 有没有办法确保函数是JIT编译的?
我有一个函数,我想确保它是JIT编译的(即在调用它之前)。是否有属性或程序集设置可以确保这一点?如果不是,那么如何保证函数是JIT编译的 谢谢 编辑: 我想这样做是为了防止我的应用程序因缺少引用程序集而崩溃。如果我的函数是JIT编译的,我可以将引用缺少的程序集的函数调用包装在try…catch块中,并优雅地处理这种情况C# 有没有办法确保函数是JIT编译的?,c#,compilation,jit,C#,Compilation,Jit,我有一个函数,我想确保它是JIT编译的(即在调用它之前)。是否有属性或程序集设置可以确保这一点?如果不是,那么如何保证函数是JIT编译的 谢谢 编辑: 我想这样做是为了防止我的应用程序因缺少引用程序集而崩溃。如果我的函数是JIT编译的,我可以将引用缺少的程序集的函数调用包装在try…catch块中,并优雅地处理这种情况 我的理解是,有时整个类(甚至整个应用程序)可能会被JIT,这将导致一个我不可能捕捉到的错误 我可能回答了一个错误的问题,但看起来您主要希望能够拦截程序集加载失败(被JITted的
我的理解是,有时整个类(甚至整个应用程序)可能会被JIT,这将导致一个我不可能捕捉到的错误 我可能回答了一个错误的问题,但看起来您主要希望能够拦截程序集加载失败(被JITted的整个类都会在调用周围击败try/catch保护,但这是在方法调用周围使用显式保护的副作用) 如果您希望捕获程序集解析问题,而不是针对每个可能的调用指定try/catch,您可以只侦听全局AssemblyResolve事件并响应程序集加载失败(我们在这里讨论的是.Net程序集,必须使用不同的机制跟踪本机dll的加载失败)
这样做的缺点是,除了在其他地方查找程序集(或记录错误),您不能做很多事情。当解析失败时,这种捕获负载失败的方法不提供特定而优雅的逻辑。如果我读对了,您会担心在首次编译类/方法时会出现错误。这需要了解边界。它可以通过额外的一层获得 如果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。这是您的应用程序需要自己解决的问题,还是您正在调试某种程序集加载问题 如果是后者,请查看融合日志。这是由在运行时探测和加载程序集的子系统生成的日志
这里有一篇文章:你到底为什么要这么做?想听这个,一定很好。我也试过类似的方法,但是,正如你所说的,在那之后,我除了记录错误之外,什么都做不了。我的目标是能够在try…catch中封装函数调用(我现在正在这样做,它工作得非常好),而不必担心我所依赖的机制(JIT编译)会失败。谢谢
void Scenario1a()
{
try
{
Scenario1b();
}
catch (..) { ... }
}
void Scenario1b()
{
var x = new SuspectType();
...
}