Error occurred in deployment step ‘Retract Solution‘: xxx 無法反序列化,因為它沒有公共的默認構造函數
一.環境:SharePoint 2016 + Visual Studio 2015,
二.錯誤描述:
錯誤1:幫朋友寫個計時器Demo,部署位置GAC,來回部署幾次後,vs2015報錯:
嚴重性 代碼 說明 項目 文件 行 禁止顯示狀態
錯誤 Error?occurred?in?deployment?step?‘Retract?Solution‘:?SP_CustomTimerJob.ListTimerJob?無法反序列化,因為它沒有公共的默認構造函數。
?
錯誤2:打開管理中心—監控—復查作業,也報錯:
SP_CustomTimerJob.ListTimerJob?無法反序列化,因為它沒有公共的默認構造函數。
錯誤3:重新運行配置向導,繼續報錯:
System.MissingMethodException:?SP_CustomTimerJob.ListTimerJob?cannot?be?deserialized?because?it?does?not?have?a?public?default?constructor
?
其他錯誤:使用各種命令卸載wsp或者刪除TimerJob,都會報上面的錯誤。整個狀態就是卸不掉,刪不掉。
?
三.解決步驟:
首先,當vs報錯時,我著魔似的順手把對應的Feature用PowerShell給刪除了,導致通過正常途徑(包括命令)再也刪不掉wsp了(這個坑害的我用了幾乎一天才爬上來)。
教訓就是,不要手動刪除wsp包中的feature,要通過卸載wsp包的方式來移除feature。
報錯的原因是繼承SPJobDefinition的類裏,沒有提供默認的構造函數。類似如下:
解決辦法,修改繼承的SPJobDefinition類,添加需要的構造函數。然後用vs重新生成一下(用vs部署會失敗)。
下面就是用gacutil.exe工具,把項目的dll註冊到GAC裏。這是最關鍵的一步。完成後,會發現管理中心的"復查作業"可以進去了。
剩下的就是用命令強制移除原來的wsp包,然後重新添加,然後重新強制安裝wsp包。
?
參考:
https://bernado-nguyen-hoan.com/2010/06/03/cant-retract-sharepoint-timer-job-because-the-job-cannot-be-deserialized-because-it-does-not-have-a-public-default-constructor/
https://sharepoint.stackexchange.com/questions/193490/solution-cannot-be-deserialized-because-it-does-not-have-a-public-default-constr
Error occurred in deployment step ‘Retract Solution‘: xxx 無法反序列化,因為它沒有公共的默認構造函數