背景: 我正在使用DirectX 9.0托管库将3d点的数组转换为2D屏幕坐标。对于速度,我使用UnsafeNativeMethods进行所有转换。为什么此代码抛出System.ExecutionEngineException
问题: 如果使用我的自定义线裁剪功能,我的应用程序死了,没有抛出任何异常,我花了一段时间才能弄清楚,它抛出一个抓不到System.ExecutionEngineException
。由于剪辑功能的最后两行,我缩小了范围。
List<Vector3> verticesAfterClipping = new List<Vector3>;
public unsafe void ClipLine(Line lineToClip)
{
this.verticesAfterClipping.Clear();
// Clipping algorithm happens here... (this is psuedo-code of what it does)
foreach(Vertex in lineToClip.Vertices)
{
bool thisIsClipped = // Set to whether this vertex is clipped
bool lastWasClipped = // Set to whether last vertex was clipped
if(thisIsClipped == false && lastWasClipped == true)
{
verticesAfterClipping.Add(/* intersection on clipping plane */);
verticesAfterClipping.Add(/* thisVertex */);
}
else if (thisIsClipped == false && lastWasClipped == false)
{
verticesAfterClipping.Add(/* thisVertex */);
}
else if (thisIsClipped == true && lastWasClipped == false)
{
verticesAfterClipping.Add(/* intersection on clipping plane */);
}
}
// THIS IS WHERE BAD THINGS HAPPEN
lineToClip.Vertices = new Vertex[verticesAfterClipping.Count];
verticesAfterClipping.CopyTo(lineToClip.Vertices, 0);
}
当verticesAfterClipping
列表复制到lineToClip
顶点则lineToClip
对象被传递给一个UnsafeNativeMethod其将这些顶点到2d中的顶点。当我以调试模式浏览它时,我能看到的所有东西都能正常工作,直到它死亡。
我根本无法弄清楚什么是错的。任何帮助将非常感激。
当你说在这两行中不发生异常时,你是对的,但它确实发生在这两行的结果中。 我替换了这些行,并使用另一个临时缓冲区来复制剪辑的顶点,现在一切正常。我认为当这行被传递给不安全的本地directx方法时,会发生某种内存访问冲突。 – tbridge 2010-11-08 00:10:37
不要认为没有ExecutionEngineException意味着问题已消失。它可能仅仅是CLR不再检测到它。通过替换这些行,您现在可能处于数据被破坏的情况,但您不再有异常。 (CLR没有也不能保证在任何时候抛出ExecutionEngineException这样的错误,只有当它发生时才会抛出它。)所以我会担心的 - 我一定会试图到达底部*如何发生这次事故,就像现在一样,没有理由确信你已经修复了它。 – 2010-11-08 14:29:28