我有几个项目:
Thingo
(主要解决方案)ThingoChooser
(插件解决方案)我正在调试插件,因此我运行主解决方案,将其当前工作目录设置为所有插件项目所针对的bin\Debug
目录。主可执行文件在GUI程序集中找到插件类并显示其主要表单。
在测试项目中,此代码可以正常工作:
this.chooser = new ThingoChooser();
foreach (var thingo in this.chooser.AvailableThingos) {
Console.WriteLine(release);
}
发布到我的GUI项目中的相同代码在StackOverFlowException
返回时失败并显示AvailableThingos
。
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应用程序在尝试StackOverFlowException
时抛出List<T>
。 :)
VS2008非常乐意让我在返回之前检查this.availableThingos
。每次单击步骤按钮StackOverflowException
时。它也发生在调试器之外。
我试过的死鸡的精细波浪,大多数由评论者建议,包括:
AvailableThingos
的返回类型更改为List<Thingo>
var
,以防隐式输入填满我public
并直接命中List<T>
更改没有帮助,堆栈跟踪不显示任何循环。在getter的}
之后单击“Step Into”按钮后,我得到异常警告浮动读数:
StackOverflowException未处理
mscorlib.dll中出现未处理的“System.StackOverflowException”类型异常
当我切换到.NET 3.5 和完全删除LINQBridge 并将支持商店的类型更改为List<Thingo>
时,该错误最为戏剧性em>和直接访问它和只需从WinForms代码中尝试:
List<Thingo> thingos = this.chooser.availableThingos.ToList();
是的:在.ToList()
上拨打List<Thingo>
可能会导致StackOverflowException
爆炸。
答案 0 :(得分:0)
问题原因是引用上的复制本地设置。
GUI项目对数据库接口项目的引用具有Copy Local set True
。它对逻辑项目的引用具有Copy Local set False
。我怀疑逻辑项目是从GUI项目看到的不同DLL返回Thingo
的枚举。
(可能需要解决问题:调试时,我正在运行第五个项目,它动态加载GUI项目的DLL。第五个项目有自己的数据库接口项目DLL副本。)
测试项目为两个项目集True
都设置了Copy Local。要么匹配有帮助,要么只是当前工作目录或路径中只有一个数据库接口DLL副本。
我很乐意接受描述为什么导致StackOverflowException
的最佳答案。我非常喜欢DuplicateCopiesOfAssemblyYouDoofusException
。
作为参考,这里是参考地图及其复制本地设置:
主命令项目(在调试器下运行,从bin\Debug
目录动态加载GUI项目):
GUI项目(配置失败):
True
False
逻辑项目:
False
测试项目:
True
True
在评论者的公平性中,直到五分钟前我才在问题中描述解决方案布局,所以我不能指望他们已经解决了。