使用 dynamic 變數時,出現 C# 編譯錯誤 CS0656

在重構一個 Visual Studio C# 專案時,碰到一個奇妙的狀況:原本整個 C# 專案都可以通過編譯,但是將其中一個類別從 A 專案移至 B 專案之後,同樣的程式碼在 B 專案竟然無法通過編譯。

編譯失敗的訊息是:

CS0656 Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create' ......

發生錯誤的地方,看起來是因為使用了 dynamic 變數。如下圖:


上網搜一下,可以發現解法是手動為專案加入 Microsoft.CSharp.dll 組件參考。

在此之前,我比對了一下 A 專案和 B 專案的屬性與相關設定,它們的目標平台都是 .NET Standard 2.0,C# 編譯器的版本也一樣:C# latest minor version。

專案的 dependencies 似乎也沒有特別不一樣的地方。也就是說,A 專案並沒有額外加入 Microsoft.CSharp.dll 組件參考。至少在 Visual Studio 2017(v15.9.7)的 Solution Explorer 以及兩個專案的 .csproj 檔案裡面都沒有發現什麼可疑的地方。

我嘗試以 Add Reference 的方式加入 Microsoft.CSharp.dll 組件,有點小麻煩:得自己去找到這個檔案。於是,我用 Nuget 套件管理員來加入:


這樣便解決了。

至於為什麼相同的程式碼放在 A 專案沒有問題,移到 B 專案卻編譯失敗呢?

我猜想,可能是 A 專案本身所引用的其他第三方套件有用到 Microsoft.CSharp.dll 吧。這我就沒進一步去實驗和確認了。

技術提供:Blogger.
回頂端⬆️