用Visual Studio 2013開啟某個古老VS2010專案,編譯時爆出以下錯誤:
Missing compiler required member System.Runtime.CompilerServices.ExtensionAttribute..ctor
主因為System.Core引用版本錯誤,ExtentionAttribute是3.0起新増的型別,故常發生於由2.0升級至3.0/3.5的.NET專案,程式使用擴充函式,專案參照仍使用2.0的System.Core造成問題。
檢視問題專案已是.NET 3.5,是否先前由2.0升級3.5已不可考,而該專案引用不少其他程式庫,其中有些仍為.NET 2.0,吻合網路討論所提2.0/3.0+版本混淆情境。但由Visual Studio檢視專案參照的System.Core版號已為3.5,會何抱怨缺少宣告?原因不明。
網路討論提到一些解決方式:
- 重建3.5新專案再一一搬入項目
工程耗時,未嘗試 - 移除造成問題的特定DLL(蠻多案例起因Json.NET之前的某個版本,但現已修正)
我的案例沒用到Json.NET,而是專案自己宣告了擴充方法(Extension Method)。試著移除擴充方法與相關程式碼,問題便消失,但在本案例中不算解決方法。 - 將專案設成2.0編譯一次(編譯失敗,但無妨),再切回3.5
測試無效 - app.config加入<bindingRedirect oldVersion="2.0.0.0-2.1.0.0" newVersion="3.5.0.0"/>
測試無效(依我理解,bindingRedirect應該只在執行階段生效才對) - 移除System.Core參照並重新加入
重新加入System.Core參照會跳出該參照已內建的訊息
A reference to 'System.Core' could not be added. This component is already automatically referenced by the build system.
專案移除System.Core參照,Missing compiler required member錯誤訊息不變。 - 手動補上public class ExtensionAttribute
最後找到可行解法:在專案裡找地方宣告一個空的System.Runtime.CompilerServices。ExtensionAttribute。namespace System.Runtime.CompilerServices
{
publicclass ExtensionAttribute : Attribute { }
}