我有几个项目:
Thingo (主要解决方案)ThingoChooser (插件解决方案)我正在调试插件,所以我运行主解决方案,将其当前工作目录设置为所有插件项目所针对的bin\Debug目录。主可执行文件在GUI程序集中查找插件类并显示其主要形式。
在测试项目中,这段代码运行良好:
this.chooser = new ThingoChooser();
foreach (var thingo in this.chooser.AvailableThingos) {
Console.WriteLine(release);
}发布到我的GUI项目中的相同代码在StackOverFlowException返回时会失败。
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返回之前检查它。当我单击step按钮时:StackOverflowException,每次。调试器也会发生这种情况。
我试过的死鸡的细波,大部分是由评论者推荐的,包括:
查看loops
AvailableThingos到List<Thingo>
var的返回类型),以防隐式键入填充了
public,将其按下directly
List<T>
更改没有帮助,堆栈跟踪也没有显示任何循环。单击getter的}后的“步骤进入”按钮一次,就会得到异常警告浮点读取:
StackOverflowException是未处理的
System.StackOverflowException类型的未处理异常发生在mscorlib.dll中
当我切换到.NET 3.5并完全删除LINQBridge并将备份存储的类型更改为List<Thingo>并直接访问它时,这个bug是最引人注目的,只需从WinForms代码中尝试如下:
List<Thingo> thingos = this.chooser.availableThingos.ToList();是的:在.ToList()上调用List<Thingo>可能会导致StackOverflowException崩溃。
发布于 2010-02-08 22:43:21
结果发现问题是引用上的复制本地设置。
GUI项目对数据库界面项目的引用具有Copy True。它对逻辑项目的引用具有复制本地集False。我怀疑逻辑项目是从一个不同于GUI项目的DLL返回一个Thingo的枚举。
(可能发生问题是必要的:在调试时,我运行第五个项目,它动态地加载GUI项目的DLL。第五个项目有自己的数据库接口项目DLL的副本。)
测试项目已将两个项目的副本本地设置为True。匹配有帮助,或者只是在当前工作目录或路径中只有一个数据库接口DLL的副本。
我很乐意接受最好的答案,描述为什么这会导致StackOverflowException。我非常喜欢DuplicateCopiesOfAssemblyYouDoofusException。
作为参考,以下是引用的映射及其副本本地设置:
Main命令项目(在调试器下运行,从其bin\Debug目录动态加载GUI项目):
GUI项目(配置失败):
复制本地= True
False逻辑项目:
复制本地= False
试验项目:
复制本地= True
True平心而论,我直到五分钟前才在问题中描述解决方案的布局,所以我不能指望他们已经解决了这个问题。
https://stackoverflow.com/questions/2221825
复制相似问题