替换默认表单实例

时间:2011-02-18 09:09:16

标签: .net vb.net winforms

我目前正在使用VB,VB有一个叫做“默认表单实例”的恼人功能,当你引用表单类而不是表单实例时,它会创建一个表单对象的默认实例。

例如:

public class frmMain  
  Inherits System.Windows.Forms.Form  
end class  

private Sub Sub1  
  frmMain.Show()  
end Sub  

上面的代码编译并运行时没有错误,因为运行时在按类名调用时会为您提供frmMain的新实例。

问题是:

有没有办法用我创建的实例替换默认实例? 另一种说法:有没有办法将我创建的实例设置为默认实例?

对于那些想问“为什么你真的需要这样的东西?”的人:

我有这个应用程序,我们称之为MyApplication.exe,这是一个Windows窗体应用程序,frmMain是主窗体。 应用程序中对主窗体的许多引用都是通过默认实例,到目前为止工作正常。 我正在对应用程序进行一些更改。我不必直接运行MyApplication.exe,而是必须动态加载程序集并通过反射运行它。我是这样做的:

Dim assembly As Reflection.Assembly = LoadAssembly("MyApplication.exe")  
Dim frm As Object = assembly.CreateInstance("MyApplication.frmMain")  
frm.Show()

我通过反射创建并显示frmMain的实例。稍后,当应用程序尝试通过默认实例访问frmMain时,运行时会创建一个新的frmMain实例,因为它认为默认实例尚未存在。但现在默认实例和屏幕上的实例是不同的对象。

底线是:通过反射,我试图模仿直接运行MyApplication.exe的确切行为。

2 个答案:

答案 0 :(得分:0)

这不能通过尝试将默认实例表单设置为其他内容来证明

    Dim newForm As New frmMain
    My.Forms.frmMain = newForm

此代码抛出ArgumentException,说“Property只能设置为Nothing”

您应该添加一个字段,然后查找并替换所有默认表单实例引用到显式引用

Private _myfrmMain as new frmMain
private Sub Sub1
_myfrmMain.Show()
end sub

答案 1 :(得分:0)

从PROJECT菜单中选择最后一项。

就像

WindowsApplication1属性...

关闭模式下的应用程序 TAB上将其更改为

最后一个表单关闭时

然后你可以有一个新的frmMain实例并关闭默认的Form1或者调用默认的Form。

我希望这会有所帮助。 : - )

Public Class Form1

    Friend WithEvents frmMain As New Form

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        frmMain.Text = "frmMain"
        frmMain.Show()
        Me.Close()

    End Sub

End Class