2008-11-17 72 views
3

如果您嘗試在未安裝此版本的.NET框架的Windows計算機上啓動.NET 3.5應用程序,則某些系統程序集(例如System.Core 3.5.0.0)將得到FileNotFoundException如果.NET 3.5沒有安裝,如何避免FileNotFoundException?

是否有可能捕獲這個異常並告訴用戶升級他們的.NET框架,或者是否過早處理它?

回答

3

您目前如何部署應用程序? ClickOnce可以在啓動前進行組裝(GAC)檢查,而使用msi,您應該有一系列可用的預檢選項...儘管不總是可行的,但您可能會考慮其中一種部署選項?

重新捕捉異常 - 只是一定要分裂主起來,以便它什麼除了捕捉到了異常 - 否則JIT可以停止加載您的主營:

// [STAThread] here if winform 
[MethodImpl(MethodImplOptions.NoInlining)] 
static void Main() { 
    try { 
     MainCore(); 
    } catch (SomeException ex) { 
     // TODO something simple but fun 
    } 
} 

static void MainCore() { ... } // your app here... 

如果你把太多在外部Main中,它可以在運行的任何之前禁用,因爲JIT可能需要這些類型。

+0

老兄,你剛剛提供瞭解決方案,我一直在工作,整個上午,你救了我幾個小時我的頭撞牆。謝謝! – Epaga 2010-03-02 13:15:52

3

最簡單的事情就是嘗試一下。 (我沒有任何非3.5的機器來測試它,但我假設你這麼做)。

使你的入口點非常簡單,只是試圖加載System.Core.dll並適當地處理異常。如果它通過,轉到另一個可以使用它的類。如果失敗,請給出相應的錯誤信息並退出。

懷疑你不需要有相當此層隔離的 - 只要你沒有這不可用類型的任何領域,我不希望大會首先須解決,直到你調用一個需要它的方法。我不得不通過C#諮詢CLR來檢查。但是,保持它相當孤立可能會更安全 - 它會避免以後意外引入依賴關係。哎呀,你甚至可以在一個單獨的組件中使用「啓動和檢查」類型,但是如果一切正常,什麼也不做,但啓動另一個組件。

2

你可以發現這個例外,是的。

在您的主程序中,只需在主消息循環中使用try..catch即可。

try 
{ 
    Application.Run(new MainForm()); 
} 
catch (Exception ex) 
{ 
    if (ex.MessageContains("Could not load file or assembly 'System.Core, Version=3.5.0.0")) 
    { 
     MessageBox.Show("This product requires the Microsoft .NET Framework version 3.5, or greater, in order to run.\n\nPlease contact your System Administrator for more information."); 
    } 
} 
相關問題