Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法确保函数是JIT编译的?_C#_Compilation_Jit - Fatal编程技术网

C# 有没有办法确保函数是JIT编译的?

C# 有没有办法确保函数是JIT编译的?,c#,compilation,jit,C#,Compilation,Jit,我有一个函数,我想确保它是JIT编译的(即在调用它之前)。是否有属性或程序集设置可以确保这一点?如果不是,那么如何保证函数是JIT编译的 谢谢 编辑: 我想这样做是为了防止我的应用程序因缺少引用程序集而崩溃。如果我的函数是JIT编译的,我可以将引用缺少的程序集的函数调用包装在try…catch块中,并优雅地处理这种情况 我的理解是,有时整个类(甚至整个应用程序)可能会被JIT,这将导致一个我不可能捕捉到的错误 我可能回答了一个错误的问题,但看起来您主要希望能够拦截程序集加载失败(被JITted的

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

谢谢

编辑:

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


我的理解是,有时整个类(甚至整个应用程序)可能会被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();
     ...
}