2009-06-01 30 views
0

我有一個函數,我想確定是編譯JIT(即在它被調用之前)。是否有屬性或程序集設置可以確保這一點?如果沒有,那麼我怎樣才能保證一個函數被編譯爲JIT?有沒有什麼方法可以確保函數編譯爲JIT?

謝謝!

編輯:

我想這樣做是爲了防止崩潰我的應用程序,原因是缺少引用的程序集。如果我的函數被編譯爲JIT,我可以將引用缺少的程序集的函數調用包裝在try ... catch塊中,並優雅地處理這種情況。

這是我的理解,有可能是整個類(甚至整個應用程序)可能是Jitted - 這會導致我不可能捕獲的錯誤。

+4

到底爲什麼要這麼做? – 2009-06-01 15:52:08

+0

想要聽到這個,它必須是好的。 – Will 2009-06-01 15:55:15

回答

2

如果我正確地閱讀了這篇文章,您會擔心第一次編譯類/方法時發生的錯誤。這需要了解邊界。它可以通過額外的層獲得。

如果SuspectType有問題(即所需的程序集未加載),則下面的try/catch無用,因爲Sision1()的Jitting本身將失敗。

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

它可以被改寫爲

void Scenario1a() 
{ 
    try 
    { 
     Scenario1b(); 
    } 
    catch (..) { ... }  

} 

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

但是,每喬恩斯基特的評論,我不知道這是否保存了的CF x。

0

我可能會回答錯誤的問題,但它看起來像你主要希望能夠攔截程序集加載失敗(整個類被JIT打敗圍繞調用的try/catch守衛,但這是使用顯式守衛的副作用周圍的方法調用)。

如果您想要捕獲程序集解析困境,而不是在每個可能的調用周圍指定try/catch,您可以只聽全局AssemblyResolve事件並響應程序集加載失敗(我們正在討論.Net程序集在這裏,原生DLL的負載故障將不得不跟蹤一個不同的機制)。

static void Main() 
{ 
    AppDomain.CurrentDomain.AssemblyResolve += OnResolveFailure; 
    //... 
} 

static Assembly OnResolveFailure(object sender, ResolveEventArgs args) 
{ 
    //Do something here... 
} 

這樣做的不足之處在於,除了在其他地方查找程序集(或記錄錯誤)外,您無法做太多工作。沒有提供解決失敗的特定和優雅的邏輯,這種捕獲負載失敗的方式。

相關問題