覆盖抽象方法的System.AccessViolationException

时间:2014-10-27 11:28:33

标签: c# visual-studio-2013 .net-4.0 abstract-class access-violation

对于我遇到问题的原因有点困惑。它花了我一段时间,但把问题解决了,这是最简单的情况,我得到以下奇怪的事情(无论如何我的眼睛)行为。

我有一个基类:

public abstract class FailedSubmitterBase
{

    public FailedSubmitterBase(UserApplicationToken userApplicationToken)
    {
    }

    public abstract int ResubmitFailed(ProviderRequest request, Access.CentralServices.CSService.Itinerary csItinerary,
            ImpersonatedUserDetails impersonatedUser, BasketItem basketItem, CRMResponseDetails crmResponseDetails,
        string crmUsername, string crmSuperUsername);
}

和一个子实例:

public class CoreFailedSubmitter : FailedSubmitterBase
{
    private string _emptyNarrativeString = "Failed to post to CS - Unspecified Error";

    protected UserApplicationToken _userApplicationToken;

    public CoreFailedSubmitter(UserApplicationToken userApplicationToken) : base(userApplicationToken)
    {
        _userApplicationToken = userApplicationToken;
    }
        /**/
    public override int ResubmitFailed(ProviderRequest request, Access.CentralServices.CSService.Itinerary csItinerary,
            ImpersonatedUserDetails impersonatedUser, BasketItem basketItem, CRMResponseDetails crmResponseDetails, string crmUsername, string crmSuperUsername)
    {
        return 0;
    }
}

当我这样称呼时:

CoreFailedSubmitter failedSubmitter = new CoreFailedSubmitter(_userApplicationToken);

return failedSubmitter.ResubmitFailed(request, csItinerary, impersonatedUser, basketItem, crmResponseDetails, crmUsername, crmSuperUsername);

我得到System.AccessViolationException

  

“尝试读取或写入受保护的内存。这通常是一个   表明其他内存已损坏。“

我在几台机器上复制它(在调试时),所以我不认为这是一个实际的内存问题。

我不明白的是,如果我只是删除抽象方法,它可以正常工作,例如:

public abstract class FailedSubmitterBase
{

    public FailedSubmitterBase(UserApplicationToken userApplicationToken)
    {
    }
 }


public class CoreFailedSubmitter : FailedSubmitterBase
{
    private string _emptyNarrativeString = "Failed to post to CS - Unspecified Error";

    protected UserApplicationToken _userApplicationToken;

    public CoreFailedSubmitter(UserApplicationToken userApplicationToken) : base(userApplicationToken)
    {
        _userApplicationToken = userApplicationToken;
    }
        /**/
    public int ResubmitFailed(ProviderRequest request, Access.CentralServices.CSService.Itinerary csItinerary,
            ImpersonatedUserDetails impersonatedUser, BasketItem basketItem, CRMResponseDetails crmResponseDetails, string crmUsername, string crmSuperUsername)
    {
        return 0;
    }
}

为什么使用abstract方法导致此失败并出现此异常?我看不出任何理由。我错过了什么?

更新

通过重新分解我的代码,我删除了abstract类并将其替换为interface。这有效。尽管interfaceabstract类正在做同样的事情,但是出于所有意图和目的。我无法理解为什么会像它那样失败。唯一突出的是这个班级Access.CentralServices.CSService.Itinerary csItinerary。这是一个自动生成的SOAP类,但同样,这只是一个普通的类,不是吗?

1 个答案:

答案 0 :(得分:1)

某些内容损坏了内存。您在删除抽象类时没有看到的原因是没有进行虚拟调用,因此不需要间接内存访问(指针)。

现在, 已经破坏了你的记忆?根据您的描述,考虑到问题总是可重现的,那么它是确定性的。所以无论你做什么导致方法调用都会破坏内存。我的猜测可能是你在这些类中所做的任何事情,或者是为了构建这些类的对象:

UserApplicationToken 
ProviderRequest 
ImpersonatedUserDetails 
BasketItem 
CRMResponseDetails 

所以你应该小心研究它们。正如@usr在评论中所述,安全的CLR代码应该产生访问冲突,因此您要么发现CLR /编译器有问题(非常不太可能)或其中一个类你使用的是罪魁祸首。另一个猜测:那些令牌和冒充不会碰巧调用原生的Win32库,是吗? Interop 与调用不安全的代码相同。