用Visual Studio 2013開啟某個古老VS2010專案,編譯時爆出以下錯誤:

Missing compiler required member System.Runtime.CompilerServices.ExtensionAttribute..ctor

爬文找到一些討論(12),歸納如下:

主因為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
    {
        public class ExtensionAttribute : Attribute { }
    }

Comments

# by Sam

在開發 VS2010 WebSite 專案發生此錯誤 可是加上執行緒大大的解法反而出現下面錯誤 「'ExtensionAttribute' 在命名空間 'System.Runtime.CompilerServices' 中模稜兩可。」 拿掉解法編譯機率性抱錯 「Missing compiler required member System.Runtime.CompilerServices.ExtensionAttribute..ctor」 鬼擋牆中...

Post a comment