【发布时间】:2010-09-23 14:31:12
【问题描述】:
是否有任何理由在模块的 Sub Main 中而不是直接在表单中启动用 VB.NET 编写的 GUI 程序(Windows 应用程序)?
编辑:该程序不会接受任何命令行参数,它将始终作为 GUI 程序执行。
【问题讨论】:
是否有任何理由在模块的 Sub Main 中而不是直接在表单中启动用 VB.NET 编写的 GUI 程序(Windows 应用程序)?
编辑:该程序不会接受任何命令行参数,它将始终作为 GUI 程序执行。
【问题讨论】:
在 VB .NET 1.x 中使用 Main() 的主要原因是添加在加载任何表单之前需要运行的代码。例如,您可能想要检测您的 Windows 窗体应用程序的实例是否已加载。或者您可能想要拦截 AppDomain 的任何未处理异常:
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf MyExceptionFilter
但是下一版本的 VB 和 Visual Studio 2005 引入了一个新的Application model,这使得 Main() 在大多数情况下都是不必要的。您现在可以拦截 My.Application.Startup event 以添加需要在加载任何表单之前运行的代码。
请注意,Startup 事件处理程序的代码存储在 ApplicationEvents.vb 文件中,默认情况下该文件是隐藏的。
【讨论】:
您可以采用任何一种方式,但您实际上应该只将代码保留在与操作和用户界面元素直接相关的表单中该表单上。应用程序启动代码与 UI 无关,通常与启动屏幕、检查网络连接、仅验证单个实例、设置用户配置设置等有关。
完成上述项目(或您的应用程序的适当初始化代码)后,Sub Main 可以创建主窗体的一个实例,然后显示它以便用户可以开始与您的应用程序交互。
这会将启动代码与您的表单代码分开。稍后,当您维护应用程序时,您会很高兴将两者分开。
【讨论】:
是的,我已经做过几次了。
一个原因是,如果您的应用程序是 COM EXE(现在从 VB6 的角度讲),那么您希望能够检测在什么上下文中调用 EXE(正在启动或被其他人说话)应用程序)。
例如:
Sub Main()
If App.StartMode = vbSModeAutomation Then
...
Else
...
End If
End Sub
另一个是如果您希望您的应用程序能够处理任何命令行参数。
例如:
Sub Main()
If App.PrevInstance Then End
If InStr(Command, "/s") > 0 Then
Form1.Show
ElseIf InStr(Command, "/p") > 0 Then
LoadPicture ("c:\windows\Zapotec.bmp")
End If
End Sub
(来自我制作屏幕保护程序的尝试之一)
【讨论】:
不,如果您总是想显示该表单。
是的,如果您有时想在没有 GUI 的情况下使用您的应用程序,只需使用命令行即可。
【讨论】:
是的,如果我想根据某些参数(在文件中、在远程服务器上等)显示不同的表单。
【讨论】: