1. 程式人生 > >Error occurred in deployment step ‘Retract Solution‘: xxx 無法反序列化,因為它沒有公共的默認構造函數

Error occurred in deployment step ‘Retract Solution‘: xxx 無法反序列化,因為它沒有公共的默認構造函數

rsh chang str visual 原來 custom change family deploy

一.環境: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 無法反序列化,因為它沒有公共的默認構造函數