覆盖抽象方法的System.AccessViolationException

Lia*_*iam 7 c# abstract-class .net-4.0 access-violation visual-studio-2013

有点困惑,为什么我有一个问题.它花了我一段时间,但已经把问题解决了,这是最简单的情况我得到以下奇怪的(无论如何我的眼睛)行为.

我有一个基类:

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);
}
Run Code Online (Sandbox Code Playgroud)

和一个子实例:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我这样称呼时:

CoreFailedSubmitter failedSubmitter = new CoreFailedSubmitter(_userApplicationToken);

return failedSubmitter.ResubmitFailed(request, csItinerary, impersonatedUser, basketItem, crmResponseDetails, crmUsername, crmSuperUsername);
Run Code Online (Sandbox Code Playgroud)

我明白了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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

更新

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

Bru*_*ant 1

有些东西破坏了记忆。删除抽象类时看不到的原因是没有进行虚拟调用,因此不需要间接内存访问(指针)。

现在,是什么破坏了你的记忆?从你的描述来看,考虑到问题总是可重现的,那么它就是确定性的。因此,无论您在方法调用之前做了什么,都会破坏内存。我的猜测是您在这些类中所做的任何事情或者为了构建这些类的对象:

UserApplicationToken 
ProviderRequest 
ImpersonatedUserDetails 
BasketItem 
CRMResponseDetails 
Run Code Online (Sandbox Code Playgroud)

所以你应该仔细研究它们。正如 @usr 在评论中所述,安全的 CLR 代码不应产生访问冲突,因此要么您发现 CLR/编译器存在问题(非常不可能),要么您正在使用的类之一是罪魁祸首。另一个猜测:这些令牌和模拟不会碰巧调用本机 Win32 库,不是吗?互操作与调用不安全代码相同。