背景: 我正在使用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