2015-04-21 27 views
4

我接管了一個包含大量遺留代碼(C++和C#)的項目,目前正在編譯VS 2010(在Windows 7上)。過時的含義

當我構建我的解決方案時,令人驚訝的是,143個項目已成功構建。但是,有一大堆警告。其中有令人吃驚的數字警告過時的功能。

warning CS0618: 'System.Runtime.InteropServices.UCOMIMoniker' is obsolete 
warning CS0618: 'System.Runtime.InteropServices.UCOMIEnumMoniker' is obsolete 
warning CS0618: 'System.Runtime.InteropServices.UCOMIRunningObjectTable' is obsolete 
warning CS0618: 'System.Runtime.InteropServices.UCOMIRunningObjectTable' is obsolete 
warning CS0618: 'System.Runtime.InteropServices.UCOMIBindCtx' is obsolete 
warning CS0618: 'System.IO.Path.InvalidPathChars' is obsolete 
warning CS0618: 'System.Configuration.ConfigurationSettings.AppSettings' is obsolete 
warning CS0618: 'System.Net.Dns.GetHostByName(string)' is obsolete 

這是什麼意思?這些函數顯然仍然是定義的,或者它們不會編譯,或者會給我某種「未找到」或「未定義」的錯誤。實施失蹤了嗎?這些功能是否仍然有效(和以前一樣)?

我已經擡頭看了很久,他們已經過時很久了。例如,的gethostbyname:

.NET框架

Supported in: 1.1 
Obsolete (compiler warning) in 4.6 
Obsolete (compiler warning) in 4.6 
Obsolete (compiler warning) in 4.5 
Obsolete (compiler warning) in 4.5.1 
Obsolete (compiler warning) in 4.5.2 
Obsolete (compiler warning) in 4 
Obsolete (compiler warning) in 3.5 
Obsolete (compiler warning) in 3.5 SP1 
Obsolete (compiler warning) in 3.0 
Obsolete (compiler warning) in 3.0 SP1 
Obsolete (compiler warning) in 3.0 SP2 
Obsolete (compiler warning) in 2.0 
Obsolete (compiler warning) in 2.0 SP1 
Obsolete (compiler warning) in 2.0 SP2 

如果我的理解是正確的,它已經過時了過去8-9年(.NET 2.0在2006年就出來了)。爲什麼沒有人修復這些問題?他們需要修理嗎?當我研究GetHostByName方法時,將其替換爲GetHostEntry。足夠簡單...但堅持下去,有很多人抱怨說,它與新功能不起作用,也許你應該用對GetHostAddresses的調用代替它。恩,當然。

鑑於我的解決方案中已經有超過28k個文件,我不確定我是否可以將事情搞得一團糟。有什麼方法可以知道過時的功能會被支持多久?我是否應該期望在安裝系統後這些功能甚至能夠正常工作?讓代碼調用過時接口(MSDN)有什麼系統影響?

我不是想了解如何從我自己的系統中刪除過時的代碼,但系統應該如何處理外部系統(如MSDN)上過時的接口。他們顯然沒有遵循一個簡單的標誌循環,過時的,替換和刪除舊界面。他們的政策是什麼? MSDN定義的接口用戶應該如何對廢棄標籤做出反應,特別是當廢棄的代碼沒有被替換爲「蘋果蘋果」等效功能時。

+1

我認爲http://stackoverflow.com/questions/3510892/usage-of-the-obsolete-attribute已經回答了這個問題的具體部分(儘管是C#特定的),剩下的 - 「支持多久過時的功能「實際上不是直接負責,因爲有大量這樣的API可能有不同的支持生命週期。通常支持幾個主要版本是合理的。 –

+0

我的問題的基本方面之一併沒有在答案中解決。過時的函數接口是否繼續有不平凡的實現?也就是說,他們還在'工作'嗎?在發佈我之前,我閱讀了這個問題,並且覺得有一些未解決的問題需要我的答案。 – LawfulEvil

+1

我期望這樣的方法「工作」(嚴格意義上它們是如何記錄的,有時候總是拋出異常可能是一種選擇,我也從來沒有聽說過.Net Framework的API這種情況),但最終會完全消失。 –

回答

8

通常,類或方法被標記爲廢棄,因爲它們將在下一個版本中被棄用,或者不再是執行某個任務的最有效方式。但是,微軟往往會長期保留這些方法以確保向後兼容。

2

在編程術語'OBSOLETE'意味着程序集/資源/函數/類型的舊版本已翻譯,這意味着編譯器會注意到有一種更好或更新的方法來實現它。例如:PHP的mysql_query()函數。

+5

我不會說「會造成問題」,因爲「現在有更好的辦法」。 –

0

我同意上述所有答案。我會建議最重要的是,當編譯器抱怨過時的方法是繼續前進的警報,並用SDK中提供的替代方法替代它。如果您不打算將您的項目升級到更新的.NET框架,那麼您終身可以忍受這個警告。