我有一個函數,我想確定是編譯JIT(即在它被調用之前)。是否有屬性或程序集設置可以確保這一點?如果沒有,那麼我怎樣才能保證一個函數被編譯爲JIT?有沒有什麼方法可以確保函數編譯爲JIT?
謝謝!
編輯:
我想這樣做是爲了防止崩潰我的應用程序,原因是缺少引用的程序集。如果我的函數被編譯爲JIT,我可以將引用缺少的程序集的函數調用包裝在try ... catch塊中,並優雅地處理這種情況。
這是我的理解,有可能是整個類(甚至整個應用程序)可能是Jitted - 這會導致我不可能捕獲的錯誤。
我有一個函數,我想確定是編譯JIT(即在它被調用之前)。是否有屬性或程序集設置可以確保這一點?如果沒有,那麼我怎樣才能保證一個函數被編譯爲JIT?有沒有什麼方法可以確保函數編譯爲JIT?
謝謝!
編輯:
我想這樣做是爲了防止崩潰我的應用程序,原因是缺少引用的程序集。如果我的函數被編譯爲JIT,我可以將引用缺少的程序集的函數調用包裝在try ... catch塊中,並優雅地處理這種情況。
這是我的理解,有可能是整個類(甚至整個應用程序)可能是Jitted - 這會導致我不可能捕獲的錯誤。
如果我正確地閱讀了這篇文章,您會擔心第一次編譯類/方法時發生的錯誤。這需要了解邊界。它可以通過額外的層獲得。
如果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。
我可能會回答錯誤的問題,但它看起來像你主要希望能夠攔截程序集加載失敗(整個類被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...
}
這樣做的不足之處在於,除了在其他地方查找程序集(或記錄錯誤)外,您無法做太多工作。沒有提供解決失敗的特定和優雅的邏輯,這種捕獲負載失敗的方式。
這是您的應用程序需要自行解決的問題,還是您正在調試某種裝配加載問題?
如果是後者,看看融合日誌。這是由運行時探測和加載程序集的子系統生成的日誌。
這裏有一個文章:http://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx
到底爲什麼要這麼做? – 2009-06-01 15:52:08
想要聽到這個,它必須是好的。 – Will 2009-06-01 15:55:15