首先,我在SO上看了一下其他的AccessViolationException问题,但是由于“编组”和不安全的代码等术语,我大部分都不太了解。
上下文:我尝试将一些Java Netty代码移植到C#。也许我把这两种语言搞混了,再也看不到了。
我只有两种方法,一种是将参数转发给另一种方法。
public override ByteBuf WriteBytes(sbyte[] src)
{
WriteBytes(src, 0, src.Length);
return this;
}
public override ByteBuf WriteBytes(sbyte[] src, int srcIndex, int length)
{
SetBytes(WriterIndex, src, srcIndex, length); // AccessViolationException throws here
return this;
}
现在,我正在测试单元测试中的第一个方法,如下所示:
var byteArray = new sbyte[256];
for (int i = 0, b = sbyte.MinValue; b <= sbyte.MaxValue; i++, b++) // -128 ... 127
{
byteArray[i] = (sbyte) b;
}
buffer.WriteBytes(byteArray); // this is the invokation
到目前为止我发现,问题似乎来自“长度”参数。我不知道,但也许我不允许在第一种方法中使用“src.Length”将其传递给第二种方法。 另外,请注意我使用sbyte,而不是字节。 (我希望这没关系。)
这是否与数组的传递引用或值传递有关?
修改 我发现必须在SetBytes的深处抛出异常。但是,我认为SetBytes从未被调用,因为我在方法的条目上设置了一个断点。但调试器从未停止过。我认为调试器无法正常工作,因为它有时不会在我设置的断点处停止。在我设法调试SetBytes的整个深度之后,从未抛出AccessViolationException。然后我 RUN 测试10x并且没有出现异常。然后我 DEBUG 再次发现整个事情,再次出现异常。
为什么会这样?