如何加快WindowsForms应用程序启动时,用户只需要在命令行使用?(How to speed

2019-10-19 06:49发布

我已经写了一些这类应用程序Windows Forms Application (GUI应用程序)和这些应用程序可以启动/从控制台叫,而不是使用图形界面,我的意思是它可以同时作为GUI或命令行中使用。

我一直都在这种“混合”应用程序看到的问题是,有CLI WinForms应用程序支持它需要更多的时间来初始化时,应用程序从CMD比正常称为Console Application ,我想,这是因为需要加载(GUI)的形式。

......所以,我想加快我的WinForms应用程序的初始化/启动时直接从命令行使用。

目前,我正在做它通过Application.Startup事件,但我想知道是否有避免/暂停窗体的Load事件更友好的方式在应用程序的交替使用告知不需要加载的形式,因为该应用是要去从控制台使用。

为了更好地理解我的问题,我会分享一些图片...

这是在我的应用程序中的图形用户界面:

这是命令行界面:

当程序从控制台称为它需要大量的时间,因为应用程序加载的形式展现显示控制台帮助。

但正如我所说我解决了这个问题所作使用本APPLICATION.STARTUP事件:

Imports Reg2Bat.Main

Namespace My

    Partial Friend Class MyApplication

        Private Sub CLI() Handles MyBase.Startup

            ' Call the method that parses the CLI arguments (if any),
            ' this is done before loading the form to speed up the CLI startup.
            ParseCLIArguments()

        End Sub

    End Class

End Namespace

...我只是想知道是否存在更好的方法来避免窗体加载事件而不触及应用程序事件。

Answer 1:

如果设置了项目启动方法Sub Main ,而不是FormX静态副主(一个模块)将运行。 你可以把它写成:

 Sub Main(argv As String()) 

抓住已经被解析那里的命令行。 据推测,如果有一个命令行,你可以去CLI路线,否则实例,并在WinForms的模式启动。

Public Sub Main(argv As String())
    If argv.Length >0 Then
        ' parse and run CLI mode (?)
    Else
        Application.EnableVisualStyles
        Application.Run(new FormMain)
    End If
End Sub

参见: https://stackoverflow.com/a/20301831/1070452



Answer 2:

由@Plutonix说另一种解决方案:

在项目属性页中取消选中“启用应用程序框架”,以便能够从一个模块加载的WinForms(GUI)应用程序,否则我不能选择一个模块的任何主子。

然后写与所需的指令来执行......的模块。例如:

''' <summary>
''' The CLI Class where are defined the CLI methods and other CLI things.
''' </summary>
Module CLI

    ''' <summary>
    ''' Defines the entry point of the application.
    ''' </summary>
    Public Sub Main()

        If My.Application.CommandLineArgs.Count <> 0 Then

            ' Attach the console.
            NativeMethods.AttachConsole(-1)

            ' Call the method that parses the CLI arguments (if any),
            ' this is done before loading the GUI form to speed up the CLI startup.
            ParseCLIArguments()

        Else

            ' Any argument was passed so I show the GUI form.
            GUI.ShowDialog()

        End If

    End Sub

''' <summary>
''' Parses the Command-Line arguments.
''' </summary>
Private sub ParseCLIArguments
    ...
End Sub

End Module


文章来源: How to speed up a WindowsForms Application startup when the user only requires the CommandLine usage?