该表单在构造过程中从默认实例引用自身,这导致无限递归

Wil*_*del 4 vb.net recursion

我目前正在尝试使用带有图形用户界面的 QuickFix 创建一个简单的客户端(启动器)。我正在使用 Visual Studio 2012 并在 VB.Net 中进行编程。

这是我的问题:当我启动应用程序时,出现此错误:“WindowsApplication1.exe 中发生了类型为‘System.InvalidOperationException’的未处理异常

附加信息:创建表单时出错。有关详细信息,请参阅 Exception.InnerException。错误是:表单在构造过程中从默认实例引用自身,这导致无限递归。在表单的构造函数中,使用“Me”引用表单。”

我的项目中有两个文件,分别是 Client GUI.vb ( http://pastebin.com/virgVNyS ) 和 MyQuickFixApp.vb ( http://pastebin.com/tQ1GXNSx )。第二个包含将 IApplication 与所有子组件集成的类。

当它从 Client GUI.vb 执行以下行:“Dim initiator As New SocketInitiator(myApp, storeFactory, settings, logFactory)”时,会发生错误,但软件会突出显示文件 Application.Designer.vb 中的一行:

Protected Overrides Sub OnCreateMainForm()
    Me.MainForm = Global.WindowsApplication1.ClientGUI
End Sub
Run Code Online (Sandbox Code Playgroud)

你能帮助我并告诉我出了什么问题吗?

非常感谢 !

var*_*bas 5

Dim filename As String = "initiator.cfg"在处理 WinForms 时,避免问题的最佳做法是在 GUI 构建/加载(在方法上)之后初始化所有内容(除了简单的变量分配,例如:很好) _Load。您收到此错误的原因是因为Me.MainForm =在实际创建主表单 ( ) 之前引用了它。

移动Dim initiator As New SocketInitiator(myApp, storeFactory, settings, logFactory)ClientGUI_LoadLoad Event主窗体的方法),错误就会消失。

注意:如果你想initiator从“任何地方”访问,你应该保留全局声明,但将赋值移到 Load 事件,即:

Dim initiator As SocketInitiator 'at the Class level, outside any sub/function (as previously)
Run Code Online (Sandbox Code Playgroud)

initiator = New SocketInitiator(myApp, storeFactory, settings, logFactory) 'Inside the ClientGUI_Load method. 
Run Code Online (Sandbox Code Playgroud)