如何从WindowsFormsApplicationBase继承?

时间:2016-02-15 11:58:26

标签: vb.net winforms inheritance

我继承了(看看,一个双关语,对不起......)一套VB.Net应用程序,这些应用程序具有共同的功能,目前在所有这些应用程序中都复制了“复制和粘贴”。我想开始重构过程。旁注:我主要是一名C#开发人员,对VB不太熟悉。

所有这些VB应用程序都在使用“应用程序框架”。我尝试做的第一件事就是让它们全部继承自一个通用的应用程序基类。我创建了一个新类:

Namespace My
   Public Class ParentApplicationBase
      Inherits Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
      Public Sub Bar()
         Console.WriteLine("Here we are in Bar()")
      End Sub
   End Class
End Namespace

然后,在ApplicationEvents.vb,ChildApp.vb和Application.Designer.vb中,我更改了

Partial Friend MyApplication

Partial Friend MyApplication : Inherits ParentApplicationBase

但是,这会导致错误:

  

为类'MyApplication'指定的基类'ParentApplicationBase'   不能与基类不同   'Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase'   其中一种部分类型。

我有双倍和三倍检查我的所有部分类确实继承自ParentApplicationBase。在应用程序框架的魔力中似乎还有一些其他“隐藏”的地方让它认为基类是WindowsFormsApplicationBase而不是ParentApplicationBase。

我搜索了一般网络和Stackoverflow都是徒劳的。我找到的最接近的是这个问题VB.NET - How do you change the namespace/class names for a "Windows application" from the default My.MyApplication?,但这没有帮助。

提前感谢任何建议!

1 个答案:

答案 0 :(得分:4)

启用应用程序框架时,VB.NET编译器会自动生成代码。其中声明了My.MyApplication类并从WindowsFormsApplicationBase派生它。您无法看到此代码,它只作为MSIL存在,您必须使用反编译器(如ildasm)才能看到它。

但是,正如错误告诉您的那样,自动生成的My.MyApplication已经将基类固定下来,您无法再对其进行更改。获得成功的唯一方法是禁用应用程序框架。没有什么可担心的,该类的主要作用是使项目的应用程序属性选项卡的设置有效,您只需使用代码即可更改它们。

项目&gt;属性&gt;应用程序选项卡&gt;取消&#34;启用应用程序框架&#34;复选框。 <启动对象> &#34; Sub Main&#34;。添加一个新模块,使其看起来类似于:

Module Entrypoint
    Sub Main(args As String())
        Application.SetCompatibleTextRenderingDefault(False)
        Dim app = New MyApplicationFramework()
        app.Run(args)
    End Sub
End Module

Class MyApplicationFramework
    Inherits ApplicationServices.WindowsFormsApplicationBase
    Public Sub New()
        MyBase.New(ApplicationServices.AuthenticationMode.Windows)
        Me.EnableVisualStyles = True
        Me.IsSingleInstance = False
        Me.SaveMySettingsOnExit = True
        Me.ShutdownStyle = ApplicationServices.ShutdownMode.AfterMainFormCloses
    End Sub
    Protected Overrides Sub OnCreateMainForm()
        Me.MainForm = New Form1
    End Sub
End Class

使用与“应用程序”选项卡中的默认设置相同的值。根据需要调整。并改变基类。