2010-02-08 29 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

在所有对评论者的公平性,直到五分钟前我没有在问题中描述解决方案的布局,所以我不能指望他们解决它。

相关问题