2012-07-12 133 views
25

我們有一個面向.Net Framework 4.0的Windows Form應用程序。安裝.Net Framework 4.5後,應用程序開始崩潰。我們將不得不調查崩潰,我們很可能不得不解決我們的問題。但是,在我們準備使用.Net 4.5之前,我們可以打開一個設置來保留舊的行爲嗎?如果安裝.Net 4.5,如何保持.net 4.0行爲?


更新2012年7月12日: 我們發現,使我們的應用程序崩潰的重大更改:給定一個System.Threading.Timer,與手柄調用Dispose(WaitHandle的)時已是關閉,那麼Timer會嘗試發出拋出異常的WaitHandle信號。 Timer的.Net 4.0實現可以容忍,但4.5不是。

我們這邊有一個錯誤;我們沒有任何理由給它一個封閉的句柄,所以我們只是修復...直到我們發現另一個bug ...

+0

您的項目是否設置爲'.NET Framework 4.0'? – 2012-07-12 18:24:34

+0

@LeonCullens:是的。 – Sylvain 2012-07-12 18:27:30

+1

@Sly我來自.NET Framework兼容團隊。你可以給我一個微軟網絡公司的netfx45compat上的repro,以便我可以看看嗎? – Varun 2012-10-16 15:20:41

回答

29

但是有一個設置,我們可以打開以保持舊的行爲,直到我們準備使用.Net 4.5?

編號.net 4.5是一個就地替換的.NET 4.當你安裝它,你有效地運行在新的框架。

一般來說,它應該完全向後兼容,但有一個few breaking changes

不幸的是,這意味着如果您想支持在安裝了4.5且未安裝4.5的計算機上運行,​​您(和其他人)將需要測試和修復這兩個框架上的問題。幸運的是,突破性變化通常都是不尋常的,邊緣情況,所以在大多數情況下不太可能影響大多數用戶。

6

我通過電子郵件與原始問題海報 - 「狡猾」討論過。感謝Sly幫助調查。事實證明,.NET4和.NET4.5的行爲與Dispose(waithandle)API的行爲方式相同。所以這個問題可能與.NET4.5無關。

static void Main(string[] args) 
    { 
     System.Threading.Timer timer = new System.Threading.Timer(new System.Threading.TimerCallback(blah)); 
     System.Threading.EventWaitHandle eventWaitHandle = new System.Threading.EventWaitHandle(true, System.Threading.EventResetMode.ManualReset); 

     eventWaitHandle.Dispose(); 
     System.Threading.Thread.Sleep(2000); 
     timer.Dispose(eventWaitHandle); 
    } 

    private static void blah(object state) 
    { 
     Console.WriteLine(40); 
    } 
相關問題