C# 删除计时器作业时,会抛出错误“对象引用未设置为对象的实例”

C# 删除计时器作业时,会抛出错误“对象引用未设置为对象的实例”,c#,sharepoint,sharepoint-2010,timer-jobs,C#,Sharepoint,Sharepoint 2010,Timer Jobs,我已使用以下代码创建了计时器作业: namespace EmployeeDemo { class DeleteEmployees : SPJobDefinition { public DeleteEmployees() : base() { } public DeleteEmployees(string jobName, SPWebApplication webapp) : base(jobName, webapp, nu

我已使用以下代码创建了计时器作业:

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();
        }
    }
}
然后我创建了一个站点范围的功能。在其事件接收器中,在停用时,我有以下代码:

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();
        }
    }
}
但这让我犯了一个错误。通过调试,我了解到该错误是在行作业.Delete;上引发的;。错误是:

对象引用未设置为对象的实例

这对我来说有点困惑,因为语句作业。Name执行得很完美,甚至让我找到了正确的计时器作业对象。但在试图删除作业时,它给我带来了错误

我发现了和我类似的问题,但这些建议对我不起作用。从开始,我尝试在SPSecurity.runwithLevelatedPrivileges中编写删除代码,但对我来说仍然不起作用

有人知道为什么会发生这种情况以及如何解决吗

更新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)

要删除作业,请使用powershell:

$jobToDelete = Get-SPTimerJob -WebApplication "http://intranet" -Identity "YourJobName"
$jobToDelete.Delete()
然后运行:

iisreset /noforce
在配置数据库中,您需要授予这些权限,以便执行删除操作:

use [Sharepoint_Config]
GO
GRANT EXECUTE ON [dbo].[proc_putObjectTVP] TO [WSS_Content_Application_Pools]
GRANT EXECUTE ON [dbo].[proc_putObject] TO [WSS_Content_Application_Pools]
GRANT EXECUTE ON [dbo].[proc_putDependency] TO [WSS_Content_Application_Pools]
GRANT EXECUTE ON [dbo].[proc_putClass] TO [WSS_Content_Application_Pools]
GRANT EXECUTE ON [dbo].[proc_getNewObjects] TO [WSS_Content_Application_Pools]
GRANT EXECUTE ON [dbo].[proc_dropObject] TO [WSS_Content_Application_Pools]
GO

若job.Delete确实抛出了异常,那个么它应该被抛出Delete方法中的某个地方。只是因为若作业为null,则会在job.Name前一行抛出异常。因此,您必须研究尚未向我们展示的Delete方法。@AndyKorneyev:Delete方法属于该类。它来自SharePoint API,所以我想我看不到它的源代码,或者可以吗?嗯,实际上你可以。例如,通过使用.NET Reflector或其他类似工具。但在探索该源代码之前,请确保它确实是job.Delete引发异常,而不是site.WebApplication.JobDefinitions?某部分之前的某一行?。对我来说,某些Microsoft API方法不太可能在没有任何明显原因的情况下抛出NullReferenceException。为了进一步阐述Andy的评论:如果你认为这不是一个简单的重复,你的问题需要包括更多细节。您至少需要提供有关异常本身的完整详细信息:异常的名称和完整的堆栈跟踪,以及您已经提供的消息,我们可以从中推断出实际的异常,但您还是应该提供这些信息。@PeterDuniho:我已经按照您的要求添加了错误详细信息。