我有一个基类:
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
。这有效。尽管interface
和abstract
类正在做同样的事情,但是出于所有意图和目的。我无法理解为什么会像它那样失败。唯一突出的是这个班级Access.CentralServices.CSService.Itinerary csItinerary
。这是一个自动生成的SOAP类,但同样,这只是一个普通的类,不是吗?
答案 0 :(得分:1)
某些内容损坏了内存。您在删除抽象类时没有看到的原因是没有进行虚拟调用,因此不需要间接内存访问(指针)。
现在, 已经破坏了你的记忆?根据您的描述,考虑到问题总是可重现的,那么它是确定性的。所以无论你做什么导致方法调用都会破坏内存。我的猜测可能是你在这些类中所做的任何事情,或者是为了构建这些类的对象:
UserApplicationToken
ProviderRequest
ImpersonatedUserDetails
BasketItem
CRMResponseDetails
所以你应该小心研究它们。正如@usr在评论中所述,安全的CLR代码应该不产生访问冲突,因此您要么发现CLR /编译器有问题(非常不太可能)或其中一个类你使用的是罪魁祸首。另一个猜测:那些令牌和冒充不会碰巧调用原生的Win32库,是吗? Interop 与调用不安全的代码相同。