如果您嘗試在未安裝此版本的.NET框架的Windows計算機上啓動.NET 3.5應用程序,則某些系統程序集(例如System.Core 3.5.0.0)將得到FileNotFoundException
。如果.NET 3.5沒有安裝,如何避免FileNotFoundException?
是否有可能捕獲這個異常並告訴用戶升級他們的.NET框架,或者是否過早處理它?
如果您嘗試在未安裝此版本的.NET框架的Windows計算機上啓動.NET 3.5應用程序,則某些系統程序集(例如System.Core 3.5.0.0)將得到FileNotFoundException
。如果.NET 3.5沒有安裝,如何避免FileNotFoundException?
是否有可能捕獲這個異常並告訴用戶升級他們的.NET框架,或者是否過早處理它?
您目前如何部署應用程序? 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可能需要這些類型。
最簡單的事情就是嘗試一下。 (我沒有任何非3.5的機器來測試它,但我假設你這麼做)。
使你的入口點非常簡單,只是試圖加載System.Core.dll
並適當地處理異常。如果它通過,轉到另一個可以使用它的類。如果失敗,請給出相應的錯誤信息並退出。
我懷疑你不需要有相當此層隔離的 - 只要你沒有這不可用類型的任何領域,我不希望大會首先須解決,直到你調用一個需要它的方法。我不得不通過C#諮詢CLR來檢查。但是,保持它相當孤立可能會更安全 - 它會避免以後意外引入依賴關係。哎呀,你甚至可以在一個單獨的組件中使用「啓動和檢查」類型,但是如果一切正常,什麼也不做,但啓動另一個組件。
你可以發現這個例外,是的。
在您的主程序中,只需在主消息循環中使用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.");
}
}
老兄,你剛剛提供瞭解決方案,我一直在工作,整個上午,你救了我幾個小時我的頭撞牆。謝謝! – Epaga 2010-03-02 13:15:52