.net - 为什么此 getter 抛出 StackOverflowException,但仅在从一个项目调用时才抛出?

标签 .net winforms nunit stack-overflow

我有几个项目:

  • 定义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/

相关文章:

c# - NUnit 中的 Assembly.GetEntryAssembly()

.net - 如何在 XAML 中设置 CommandParameter?

c# - 为什么 IList<T> 没有排序?!?! (编辑)

C# Winforms 数据绑定(bind)

wpf - 什么类型的应用程序启动更快 : Windows Forms or WPF?

测试桌面应用程序

c# - 读取 MSMQ 事务性死信队列

c# - .NET CF——根据InputPanel状态设置表单高度

c# ".datasource"未显示在框中

c# - 如何确定哪个参数集导致测试失败?