簡體   English   中英

為什么此代碼拋出System.ExecutionEngineException

[英]Why this code throws System.ExecutionEngineException

背景:我使用DirectX 9.0托管庫將3d點數組轉換為2d屏幕坐標。 為了速度,我使用UnsafeNativeMethods來完成所有的轉換。

問題:如果使用我的自定義行剪切功能,我的應用程序死了而不會拋出任何異常,我花了一段時間才發現它拋出了一個無法捕獲的 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頂點。 從我在調試模式中逐步完成它時可以看到的一切,它完全正常,直到它完全消失。

我根本無法弄清楚出了什么問題。 任何幫助將非常感激。

實際上可能不會在拋出異常的行中發生此問題。 這可能只是之前發生的事情的症狀。

當CLR 檢測到某些內容出現嚴重錯誤時,拋出System.ExecutionEngineException異常。 這可能在問題發生后相當長的一段時間內發生。 這是因為異常通常是內部數據結構損壞的結果--CLR發現某些東西已進入一種無意義的狀態。 它拋出一個無法捕獲的異常,因為它不安全。

因此,您可能在系統中某些完全不相關的部分中有一些代碼會破壞某些內容,但這只有在這段特定代碼運行時才會變得明顯。 您展示的代碼可能很好。 (它也可能不是......我沒有看到任何明顯的錯誤,但后來我不知道DX 9托管庫。例如,我無法看到此方法的哪個功能需要unsafe關鍵字。 )

不幸的是,這意味着你需要開始更寬一點的網絡。 幾乎任何使用不安全代碼或COM互操作的東西都可能是可疑的。 遺憾的是,這將是一個漫長而乏味的過程。 您可能采用的一種方法是嘗試逐步簡化程序:可以說明問題的最小代碼是什么? (例如,如果你把你在那里顯示的代碼放到一個除了對該方法最簡單的調用之外什么都沒有的應用程序中,它仍然會失敗嗎?)

我對不同的庫有同樣的問題。 在我的情況下,所有開始很久以前因為我必須在64位環境中運行32位.net應用程序。 這給我帶來了很多麻煩,架構之間的兼容性,或.NET框架的CLR之間的兼容性也可能是你的問題。

PS:現在我知道我的麻煩是什么,但不知道它在哪里

我有兩個類來處理我的數據庫中的特定表

StorageManager - 具有處理與數據庫的直接交互的方法的類

Controller - 一個具有處理api調用的方法的類

當即將創建表中的新條目時,我會檢查子表中是否存在可能已存在的某些值。

我編寫了這些方法來檢查錯誤類中的預先存在/重復,最終導致執行initngneineexception被拋出。

移動方法使它們與正確的數據庫上下文一起生活似乎為我解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM