次のコードでタイマー ジョブを作成しました。
namespace EmployeeDemo
{
class DeleteEmployees : SPJobDefinition
{
public DeleteEmployees() : base() { }
public DeleteEmployees(string jobName, SPWebApplication webapp)
: base(jobName, webapp, null, SPJobLockType.ContentDatabase)
{
this.Title = "Delete Employees Timer Job";
}
public override void Execute(Guid targetInstanceId)
{
// Code
}
}
}
次に、サイト限定機能を作成しました。非アクティブ化時のイベントレシーバーには、次のコードがあります。
const string timerJobName = "Delete Employees Timer Job";
public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
DeleteJob(properties.Feature.Parent as SPSite);
}
private void DeleteJob(SPSite site)
{
foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
{
if (job.Name == timerJobName)
{
job.Delete();
}
}
}
しかし、それは私にエラーを投げます。デバッグから、行でエラーがスローされることがわかりましたjob.Delete();
。エラーは次のとおりです。
オブジェクト参照がオブジェクト インスタンスに設定されていません。
job.Name
ステートメントが問題なく実行され、適切なタイマー ジョブ オブジェクトが取得されるので、これはちょっと混乱します。しかし、ジョブを削除しようとすると、エラーが発生します。
私と同様の問題でこの質問を見つけましたが、提案はうまくいきませんでした。この議論から、削除コードを書き込んでみましたSPSecurity.RunWithElevatedPrivileges
が、それでもうまくいきませんでした。
なぜこれが起こるのか、これを解決する方法を知っている人はいますか?
更新 1
もう少し詳しく。
NullReferenceException はユーザー コードによって処理されませんでした
オブジェクト参照がオブジェクト インスタンスに設定されていません。
ここにスタックトレースがあります
at Microsoft.SharePoint.Administration.SPConfigurationDatabase.DeleteObject(Guid id)
at Microsoft.SharePoint.Administration.SPConfigurationDatabase.Microsoft.SharePoint.Administration.ISPPersistedStoreProvider.DeleteObject(SPPersistedObject persistedObject)
at Microsoft.SharePoint.Administration.SPPersistedObject.Delete()
at Microsoft.SharePoint.Administration.SPJobDefinition.Delete()
at EmployeeDemo.Features.DeleteEmpFeature.DeleteEmpFeatureEventReceiver.DeleteJob(SPSite site)
at EmployeeDemo.Features.DeleteEmpFeature.DeleteEmpFeatureEventReceiver.FeatureDeactivating(SPFeatureReceiverProperties properties)
at Microsoft.SharePoint.SPFeature.DoActivationCallout(Boolean fActivate, Boolean fForce)