2010-02-08 57 views
3

我有幾個項目:爲什麼這個getter拋出StackOverflowException,但只有從一個項目中調用時纔會拋出StackOverflowException?

  • 數據庫界面項目定義Thingo(主溶液)
  • 邏輯項目定義ThingoChooser(插件溶液),其指的是邏輯項目
  • 的GUI項目(
  • 的測試項目,是指在邏輯項目(插件溶液)

我調試插件溶液插件,所以我運行主要解決方案,將其當前工作目錄設置爲由所有插件項目定位的bin\Debug目錄。主可執行程序在GUI程序集中查找插件類並顯示其主窗體。

在測試項目中,該代碼工作正常:

this.chooser = new ThingoChooser(); 
foreach (var thingo in this.chooser.AvailableThingos) { 
    Console.WriteLine(release); 
} 

相同的代碼,貼到我的GUI項目,失敗與StackOverFlowExceptionAvailableThingos回報。

ThingoChooser.AvailableThingos看起來是這樣的:

public IEnumerable<Thingo> AvailableThingos { 
     get { 
      // Yes, it DEFINITELY case-matches the private variable, 
      // NOT the public property. Oh, I wish this were that easy! 
      return this.availableThingos; 
     } 

     private set { 
      // ... 
     } 
    } 

...到什麼樣的IEnumerable<Thingo>我設置this.availableThingos

這是一個List<Thingo>

是的,我有一個WinForms應用程序,當試圖走List<T>時拋出StackOverFlowException:)

VS2008非常樂意讓我在返回之前檢查this.availableThingos。當我每次單擊步驟按鈕時:StackOverflowException。它也發生在調試器外面。

的死雞我試過的細浪,最受評論者建議,包括:

  • 望着for循環
  • 改變的AvailableThingos返回類型的堆棧跟蹤List<Thingo>
  • 刪除var如果隱式打字塞滿了我
  • 使財產的後盾存儲變量public並直接打它
  • 改變後備存儲到List<T>
  • 刪除LINQBridge和重新定位到.NET 3.5

的變化不幫忙,和堆棧跟蹤不顯示任何循環。之後,吸氣的}後的「進入」按鈕的點擊,我得到的異常警告浮式閱讀:

StackOverflowException是未處理

類型的未處理的異常「系統。 StackOverflowException」出現在mscorlib.dll

bug是在其最引人注目的當我切換到.NET 3.5 刪除LINQBridge完全後備存儲的類型更改爲List<Thingo>直接訪問它簡單地從的WinForms代碼試試這個:

List<Thingo> thingos = this.chooser.availableThingos.ToList(); 

沒錯:在List<Thingo>調用.ToList()可以StackOverflowException炸燬。

+0

什麼是winform代碼的樣子?你確定堆棧溢出不是源於你對錶單中的每個列表項所做的事情嗎? – Paolo 2010-02-08 13:29:52

+1

您可以將字段'availableThingos'公開 - 並使用'chooser.availableThingos' - 只是爲了調試目的而刪除該屬性的調用? – tanascius 2010-02-08 13:31:00

+3

來自你發佈的帖子我會說它不是吸氣劑,但創建SO的客戶端代碼和吸氣劑恰好是堆棧中的最後一個方法,所以第一個問題是「什麼其他方法多次在當你得到SO時堆疊?「如果您發佈了一些可能有所幫助的堆棧跟蹤和/或WinForm代碼 – 2010-02-08 13:32:49

回答

0

問題原來與複製本地設置上的引用。

GUI項目對數據庫接口項目的引用具有複製本地集True。它對邏輯項目的引用有Copy Local False。我懷疑這個邏輯項目是從GUI項目看到的不同DLL中返回一個Thingo的枚舉。 (這可能是發生問題的必要條件:在調試時,我正在運行第五個爲GUI項目動態加載DLL的項目,第五個項目有自己的數據庫接口項目DLL副本。)

測試項目對於兩個項目設置了True的Copy Local。無論是匹配,還是僅在當前工作目錄或路徑中只有一個數據庫接口DLL副本的事實。

我會很樂意接受最好的回答描述爲什麼這造成StackOverflowException。我強烈建議使用DuplicateCopiesOfAssemblyYouDoofusException

僅供參考,這裏的引用文件,其複製本地設置的地圖:

主指令的項目(在調試器中運行,動態地加載GUI項目從bin\Debug目錄):

  • 擁有數據庫接口DLL與主可執行文件位於同一目錄中。這是與其提示路徑中目標下面的所有數據庫接口引用相同的目錄。

GUI項目(失敗配置):

  • REF→數據庫項目:複製本地= True
  • REF→邏輯項目:複製本地= False

邏輯項目:

  • ref→Datab ASE項目:複製本地= False

測試項目:

  • 裁判→邏輯的項目:複製本地= True
  • 裁判→數據庫項目:複製本地= True

在所有對評論者的公平性,直到五分鐘前我沒有在問題中描述解決方案的佈局,所以我不能指望他們解決它。

相關問題