一、起因:
最近在做的一個項目,因為很多地方要用到同一套流程。為了后期維護,要求將共用流程進行抽離,創建為一個公用的類庫。在抽離之前程序運行是沒有問題的,然而在抽離之后就得到了如題錯誤: object不包含xxx的定義。 遇到這個錯誤時也是相當的郁悶,根本就覺得莫名奇妙,完全相同的代碼,只是拿出來以類庫的形式調用而已。
二、查找:
遇到問題總得想法子解決,接下來就是進行調試,調試下來就更是摸不着頭腦。來看下面的兩張截圖。看到圖一的錯誤,立即對products進行了監視,看到的結果卻是圖二這樣的(哎呀,這不明明有IsOk屬性嗎?什么鬼...)。由於完全沒有思路,無從下手,於是開始了面向百度編程,找到了這個bug的原因。
(圖一)
(圖二)
三、解決:
原來是匿名類型在編譯后,訪問修飾符是internal級別的,當跨程序集訪問時就會出現如題錯誤(apiTL.ProductList()返回的是一個匿名類型)。這也就是為什么在抽離前程序運行是正常的(因為在同一程序集中),而抽離后報錯的原因。知道了原因,就來解決它。
示例:
程序集A(匿名對象所在的程序集);程序集B(調用程序集A的方法,接收匿名對象)。那么只需要在 程序集A 的AssemblyInfo.cs中加上如下語句,意思是對指定的程序集可見(既:對程序集B可見)
[assembly: InternalsVisibleTo("程序集B")]