gpt4 book ai didi

c# - 重写抽象方法的 System.AccessViolationException

转载 作者:太空狗 更新时间:2023-10-29 20:39:17 24 4
gpt4 key购买 nike

我有点困惑为什么我有问题。我花了一些时间,但将问题分解为最简单的情况后,我得到了以下奇怪的(无论如何在我看来)行为。

我有一个基类:

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:

"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."

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

我不明白的是,如果我简单地删除它工作正常的抽象方法例如:

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 类,但同样,这只是一个普通类,不是吗?

最佳答案

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

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

UserApplicationToken 
ProviderRequest
ImpersonatedUserDetails
BasketItem
CRMResponseDetails

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

关于c# - 重写抽象方法的 System.AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26586571/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com