我有几个项目:
- 定义
Thingo
的数据库接口(interface)项目(主要解决方案) - 定义
ThingoChooser
的逻辑项目(插件解决方案) - 引用逻辑项目(插件解决方案)的 GUI 项目
- 引用逻辑项目(插件解决方案)的测试项目
我正在调试插件,所以我运行主解决方案并将其当前工作目录设置为 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>
- 删除 LINQBridge 并重新定位到 .NET 3.5
这些更改没有帮助,堆栈跟踪也没有显示任何循环。在 }
之后单击“Step Into”按钮后 setter/getter ,我得到异常警告漂浮阅读:
StackOverflowException was unhandled
An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll
当我切换到 .NET 3.5 并完全删除 LINQBridge 并且将后备存储的类型更改为 List<Thingo>
时,该错误最为严重。 和直接访问它和只需从 WinForms 代码中尝试:
List<Thingo> thingos = this.chooser.availableThingos.ToList();
是的:调用 .ToList()
在 List<Thingo>
上可以炸毁 StackOverflowException
.
最佳答案
问题出在引用文献中的复制本地设置。
GUI 项目对数据库接口(interface)项目的引用已将 Copy Local 设置为 True
。它对逻辑项目的引用已将 Copy Local 设置为 False
。我怀疑逻辑项目从与 GUI 项目看到的不同的 DLL 返回 Thingo
的枚举。
(可能是问题发生的必要条件:调试时,我正在运行第五个项目,该项目动态加载 GUI 项目的 DLL。第五个项目有自己的数据库接口(interface)项目 DLL 副本。)
测试项目为两个项目设置了 Copy Local True
。匹配有帮助,或者只是在当前工作目录或路径中只有一个数据库接口(interface) DLL 副本这一事实。
我很乐意接受描述为什么这会导致 StackOverflowException
的最佳答案。我非常喜欢 DuplicateCopiesOfAssemblyYouDoofusException
。
作为引用,这里是引用 map 及其复制本地设置:
主要命令项目(在调试器下运行,从其 bin\Debug
目录动态加载 GUI 项目):
- 在与主要可执行文件相同的目录中具有数据库接口(interface) DLL。这是与提示路径中目标下方的所有数据库接口(interface)引用相同的目录。
GUI 项目(配置失败):
- ref→ 数据库项目:Copy Local =
True
- ref→ 逻辑项目:Copy Local =
False
逻辑项目:
- ref→ 数据库项目:Copy Local =
False
测试项目:
- ref→ 逻辑项目:Copy Local =
True
- ref→ 数据库项目:Copy Local =
True
平心而论,我直到五分钟前才在问题中描述解决方案布局,所以我不能指望他们已经解决了它。
关于.net - 为什么此 getter 抛出 StackOverflowException,但仅在从一个项目调用时才抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2221825/