1

次のコードでタイマー ジョブを作成しました。

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)
4

1 に答える 1