gpt4 book ai didi

c# - 为什么此代码抛出 System.ExecutionEngineException

转载 作者:可可西里 更新时间:2023-11-01 08:41:41 25 4
gpt4 key购买 nike

背景:我正在使用 DirectX 9.0 托管库将 3d 点数组转换为 2d 屏幕坐标。为了提高速度,我使用 UnsafeNativeMethods 进行所有转换。

问题:如果使用我的自定义线裁剪功能,我的应用程序会在没有抛出任何异常的情况下死机,我花了一段时间才弄清楚它抛出了一个uncatchable 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 顶点.当我在 Debug模式下单步执行它时,从我看到的一切来看,它工作得很好,直到它死掉。

我根本不知道哪里出了问题。任何帮助将不胜感激。

最佳答案

问题可能实际上并没有发生在抛出异常的行中。这可能只是之前发生的事情的征兆。

System.ExecutionEngineException 异常在 CLR 检测到出现严重错误时被抛出。这可能会在问题发生后的相当长一段时间内发生。这是因为异常通常是内部数据结构损坏的结果——CLR 发现某些东西进入了一种没有意义的状态。它会抛出一个无法捕获的异常,因为继续进行是不安全的。

所以您可能在系统的某个完全不相关的部分中有一些代码破坏了某些东西,但这只有在这段特定的代码运行时才会变得明显。您显示的代码可能没问题。 (它也可能不是......我没有看到任何明显的错误,但是我不太了解 DX 9 托管库。例如,我看不到此方法的哪个功能需要 unsafe 关键字。 )

不幸的是,这意味着您需要开始将网撒得更广一些。几乎任何使用不安全代码或 COM 互操作的东西都可能是可疑的。遗憾的是,这将是一个漫长而乏味的过程。您可能采用的一种方法是尝试逐渐简化程序:可以说明问题的最小代码段是什么? (例如,如果您将您在此处显示的代码放入一个应用程序中,该应用程序除了对该方法的最简单调用外什么都不包含,它是否仍然会失败?)

关于c# - 为什么此代码抛出 System.ExecutionEngineException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4102881/

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