开发实用控件、服务及应用部署全解析
1. 控件开发基础
1.1 用户控件与 Web 用户控件
用户控件类似于迷你 Windows 窗体,允许自由放置其他控件,还能处理自身事件,如 Click 事件,以此创建自定义控件,也可添加 Windows 控件形成复合控件。它支持属性、方法和事件,添加方法与普通控件类似,还能添加到其他应用的窗体中使用。
Web 用户控件与标准用户控件类似,但专为 Web 应用设计。创建 Web 用户控件的代码过程与创建用户控件相似,具备相同的属性、方法和事件。不过,使用方式有所不同:
- 用户控件 :添加到工具箱后拖到 Windows 窗体。
- Web 用户控件 :直接从解决方案资源管理器拖到 Web 窗体。
1.2 多线程编程
多线程编程可创建、启动线程并让其在后台工作,还能对线程进行暂停、恢复、停止和休眠等操作。在多线程示例中,可使用自定义事件实现线程间通信,避免后台任务干扰用户界面。同时,可通过 SyncLock 语句和 Join 方法同步线程:
- SyncLock :限制线程对对象等项目的访问,实现线程操作同步。
- Join 方法 :确定线程何时完成或终止,适用于需要等待线程完成的情况。
1.3 常见问题解答
| 问题 | 解答 |
|---|---|
| 能否从用户控件派生新控件? | 可以,在解决方案资源管理器中选择用户控件,从项目菜单选择“添加继承控件”,在“名称”框输入派生控件名称,打开“继承选择器”窗口,双击要继承的控件名称并点击“确定”。 |
| 能否使用线程处理用户界面控件? | 可以,但有风险。微软建议仅在创建窗体或控件的线程中执行其方法,若在线程中处理用户元素,不要使用 SyncLock 语句,否则程序可能挂起。 |
1.4 实践检验
1.4.1 测验
- 如何创建新的用户控件?
- 选择“文件”>“新建项目”,在“新建项目”对话框中选择“Windows 控件库”。
- 也可在应用中选择“项目”>“添加用户控件”。
- 想将用户控件添加到 Windows 窗体,但在“添加引用”对话框中找不到,可能是什么问题?
可能未编译用户控件,可选择“生成”>“生成解决方案”进行编译。 - 想将 Web 用户控件添加到 Web 窗体,应从哪里拖动该控件?
从解决方案资源管理器。 - Thread 类的 Join 方法有什么作用?
用于确定线程何时完成或终止,在需要等待线程完成后再继续执行代码时使用。 - 若想让线程比其他线程获得最少的时间,应给线程设置什么优先级?
将线程的 Priority 属性设置为 ThreadPriority.Lowest。
1.4.2 练习
- 创建一个类似计时器应用的闹钟用户控件,让用户设置闹钟响起时间,并包含“闹钟开启”和“闹钟关闭”按钮。(额外任务:将闹钟修改为可记录重要日期的日程日历。)
- 创建一个新的 Windows 应用程序,使用线程递增计数器,通过自定义事件在文本框中显示当前计数。让用户使用“开始”和“停止”按钮启动和结束线程,同时实现“暂停”和“恢复”按钮。(额外任务:实现两个同步线程递增相同的计数器值。)
2. 服务开发进阶
2.1 Windows 服务创建
Windows 服务通常在后台运行,无始终打开的用户界面,常通过任务栏图标操作。其生命周期与标准 Windows 应用不同,一般随计算机启动自动运行,关机时停止。
在 Visual Basic .NET 中,Windows 服务基于 ServiceBase 类,需重写 OnStart 和 OnStop 方法,分别在服务启动和停止时调用。还可配置服务自动启动或手动使用服务控制管理器(SCM)启动,也可重写 OnPause 和 OnContinue 事件处理程序处理暂停和恢复情况。
单个 Windows 服务可包含多个服务,但每个服务都需要安装程序。多数情况下,Windows 服务在系统账户下运行,安装时可使用 ServiceProcessInstaller 对象设置服务在特定用户账户下运行。
创建新的 Windows 服务项目步骤如下:
1. 选择“文件”>“新建”>“项目”。
2. 在“新建项目”对话框的“模板”框中选择“Windows 服务”,命名为 WindowsService1。
2.2 事件日志记录
为使 Windows 服务写入事件日志,需进行以下操作:
1. 从工具箱的“组件”选项卡拖动 EventLog 对象到 Windows 服务设计器。
2. 设置事件日志的 Log 属性为日志名称,如 NewLog1,并确保 Windows 服务的 AutoLog 属性为 True。
3. 创建事件源,例如在 Windows 服务的构造函数中创建名为 VBSource1 的源,并将其名称分配给 EventLog 对象的 Source 属性:
Public Sub New()
MyBase.New()
' 此调用是组件设计器所必需的。
InitializeComponent()
' 在 InitializeComponent() 调用之后添加任何初始化
If Not EventLog1.SourceExists("VBSource1") Then
EventLog1.CreateEventSource("VBSource1", "NewLog1")
End If
EventLog1.Source = "VBSource1"
End Sub
- 在 OnStart 和 OnStop 方法中使用 WriteEntry 方法写入日志:
Protected Overrides Sub OnStart(ByVal args() As String)
EventLog1.WriteEntry("Starting WindowsService1.")
End Sub
Protected Overrides Sub OnStop()
EventLog1.WriteEntry("Stopping WindowsService1.")
End Sub
2.3 服务安装与管理
2.3.1 创建安装程序
点击属性窗口描述部分的“添加安装程序”链接,创建 ProjectInstaller.vb,其中包含 ServiceProcessInstaller1 和 ServiceInstaller1 对象。
2.3.2 配置安装参数
- ServiceProcessInstaller1 :设置 Account 属性为运行服务的账户类型,如 LocalSystem、LocalService、NetworkService 或 User,若选择 User,需设置 Username 和 Password 属性。
- ServiceInstaller1 :确保 ServiceName 属性设置为服务名称,如 Service1;使用 StartType 属性指定服务启动方式,可选择 ServiceStartMode.Automatic(系统启动时自动启动)、ServiceStartMode.Disabled(禁用服务)或 ServiceStartMode.Manual(手动启动),测试时建议选择 Manual。
2.3.3 构建与安装服务
- 选择“生成”>“生成 WindowsService1”,创建 WindowsService1.exe。
- 使用 InstallUtil.exe 工具安装服务,例如在 Windows 2000 中,在 DOS 命令提示符下执行:
C:\WINNT\Microsoft.NET\Framework\xxxxxxxxxx>installutil c:\vbnet2003\day21\WindowsService1\bin\WindowsService1.exe
2.3.4 启动与停止服务
- 启动服务 :在服务控制管理器中右键点击服务名称,选择“启动”。
- 停止服务 :在服务控制管理器中右键点击服务名称,选择“停止”。
2.3.5 检查事件日志
在 Visual Basic .NET 中,打开服务器资源管理器的“事件日志”节点,查看 NewLog1 中 VBSource1 的条目,确认服务是否成功写入日志。
2.4 与其他应用交互
若要从其他应用与 Windows 服务交互,可按以下步骤操作:
1. 从工具箱的“组件”选项卡拖动 ServiceController 对象到 Windows 应用的窗体。
2. 设置 MachineName(服务运行的计算机名称,本地计算机可设置为“.”)和 ServiceName 属性。
3. 右键点击当前项目,选择“添加引用”,在“添加引用”对话框的“.NET”选项卡中选择 System.dll 和 System.ServiceProcess.dll。
4. 在应用代码中包含 System 和 System.ServiceProcess 命名空间的 Imports 或 Using 语句。
5. 使用 ServiceController 对象访问服务的属性和方法,示例代码如下:
Imports System
Imports System.ServiceProcess
Public Class Form1
'...
Dim Controller1 As New System.ServiceProcess.ServiceController("Service1")
If Controller1.CanStop Then
MsgBox(Controller1.ServiceName & " may be stopped.")
End If
End Class
2.5 服务相关类解析
2.5.1 ServiceBase 类
ServiceBase 类是 Windows 服务的基类,包含以下重要属性和方法:
|属性/方法|说明|
|----|----|
|AutoLog|指定是否自动在事件日志中记录启动、停止、暂停和继续命令。|
|CanPauseAndContinue|返回或设置服务是否可暂停和继续。|
|CanShutdown|返回或设置服务在系统关机时是否应收到通知。|
|CanStop|返回或设置服务是否可停止。|
|EventLog|返回可写入的事件日志。|
|ServiceName|返回或设置用于标识服务的名称。|
|OnContinue|服务暂停后继续时调用。|
|OnPause|服务暂停时调用。|
|OnPowerEvent|计算机电源状态改变时调用。|
|OnShutdown|系统关机时调用。|
|OnStart|服务启动时调用。|
|OnStop|服务停止时调用。|
2.5.2 EventLog 类
EventLog 类支持访问 Windows 服务使用的事件日志,包含以下重要成员:
|成员类型|成员名称|说明|
|----|----|----|
|公共类方法|CreateEventSource|创建事件源,使应用程序可写入日志。|
|公共类方法|Delete|删除日志。|
|公共类方法|DeleteEventSource|移除应用程序的事件源注册。|
|公共类方法|Exists|判断日志是否存在。|
|公共类方法|GetEventLogs|返回事件日志数组。|
|公共类方法|LogNameFromSourceName|返回与源注册的日志名称。|
|公共类方法|SourceExists|检查特定事件源是否存在。|
|公共类方法|WriteEntry|在日志中写入条目。|
|公共属性|Entries|返回日志内容。|
|公共属性|Log|返回或设置日志名称。|
|公共属性|LogDisplayName|返回日志的显示名称。|
|公共属性|MachineName|返回或设置日志所在的计算机名称。|
|公共属性|Source|返回或设置写入日志时使用的源名称。|
|公共方法|BeginInit|开始事件日志的初始化。|
|公共方法|Clear|清除日志中的所有条目。|
|公共方法|Close|关闭日志。|
|公共方法|EndInit|结束事件日志的初始化。|
|公共方法|WriteEntry|在事件日志中写入条目。|
|公共事件|EntryWritten|数据写入事件日志时触发。|
2.5.3 ServiceProcessInstaller 类
ServiceProcessInstaller 对象负责安装 Windows 服务的特定进程,包含以下重要属性、方法和事件:
|属性/方法/事件|说明|
|----|----|
|Account|返回或设置服务的账户类型。|
|HelpText|返回服务选项的帮助文本。|
|Installers|返回使用的安装程序。|
|Parent|返回或设置父安装程序。|
|Password|返回或设置用户账户的密码。|
|Username|返回或设置用户账户。|
|Install|将服务信息写入注册表。|
|Rollback|回滚写入注册表的服务信息。|
|Uninstall|移除安装。|
|AfterInstall|安装完成后发生。|
|AfterRollback|安装回滚后发生。|
|AfterUninstall|卸载操作完成后发生。|
|BeforeInstall|Install 方法运行前发生。|
|BeforeRollback|安装程序回滚前发生。|
|BeforeUninstall|卸载操作前发生。|
|Committed|所有安装程序完成安装提交后发生。|
|Committing|安装程序提交安装前发生。|
2.5.4 ServiceInstaller 类
ServiceInstaller 对象用于安装 Windows 服务,包含以下重要属性、方法和事件:
|属性/方法/事件|说明|
|----|----|
|(此处列出 ServiceInstaller 类的重要属性、方法和事件)|(详细说明)|
|(可根据实际情况补充完整表格内容)|(可根据实际情况补充完整表格内容)|
2.6 服务开发注意事项
Windows 服务若存在错误可能导致 Windows 不稳定,测试时应将服务启动模式设为手动,避免重启时自动启动。若遇到有问题的服务自动启动导致 Windows 挂起,可在开机时按住 F8 键以安全模式启动。
3. Web 服务开发
3.1 Web 服务概述
Web 服务是用于 Web 的服务,是一种可被 Web 应用调用并返回数据(如数据库数据)的 Web 组件。它可用于创建业务对象以实现自定义逻辑,如在考虑贷款前对用户进行信用检查,还能作为三层数据 Web 应用中的中间层业务对象,处理和传递数据。
3.2 创建 Web 服务步骤
虽然文档未详细给出创建 Web 服务的具体代码步骤,但通常创建 Web 服务会涉及以下通用流程:
1. 项目创建 :在开发环境中创建一个新的 Web 服务项目。
2. 定义服务接口 :确定 Web 服务要提供的功能和方法,这些方法将被外部应用调用。
3. 实现服务逻辑 :在服务内部实现定义好的方法逻辑,可能涉及数据库查询、业务计算等操作。
4. 发布服务 :将 Web 服务部署到 Web 服务器上,使其可以被外部访问。
3.3 访问 Web 方法
访问 Web 方法一般步骤如下:
1. 添加服务引用 :在调用 Web 服务的应用程序中,添加对目标 Web 服务的引用。这通常可以通过开发环境中的“添加服务引用”功能完成,输入 Web 服务的 URL 地址,开发环境会自动生成代理类。
2. 实例化代理对象 :在代码中实例化生成的代理类对象。
3. 调用方法 :使用代理对象调用 Web 服务中定义的方法,并处理返回结果。
以下是一个简单的示例代码(假设使用 C# 和 Visual Studio):
using System;
using System.Web.Services.Protocols;
class Program
{
static void Main()
{
try
{
// 实例化代理对象
MyWebService.MyWebServiceSoapClient client = new MyWebService.MyWebServiceSoapClient();
// 调用 Web 方法
string result = client.MyWebMethod();
Console.WriteLine("Web 方法返回结果: " + result);
}
catch (SoapException ex)
{
Console.WriteLine("SOAP 异常: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("其他异常: " + ex.Message);
}
}
}
3.4 Web 服务与 Windows 服务对比
| 对比项 | Web 服务 | Windows 服务 |
|---|---|---|
| 应用场景 | 主要用于 Web 应用之间的数据交互和业务逻辑处理,可跨网络访问 | 通常在后台运行,为系统或其他应用提供支持服务,可能与设备驱动等相关 |
| 用户界面 | 一般无直接用户界面,通过网络接口供其他应用调用 | 通常无始终打开的用户界面,可能有可通过任务栏图标打开的控制面板 |
| 运行环境 | 依赖 Web 服务器,如 IIS 等 | 运行在 Windows 操作系统上 |
| 调用方式 | 通过网络协议(如 HTTP、HTTPS)调用 | 可通过 ServiceController 等对象在本地或远程计算机上控制和交互 |
4. 应用部署
4.1 部署概述
Visual Basic .NET 应用程序通常使用 Windows 安装程序(使用 Microsoft Installer (.msi) 文件)进行安装。部署应用程序是将开发好的应用程序配置并安装到目标环境的过程,确保应用程序能够正常运行。
4.2 创建 .msi 文件步骤
创建 .msi 文件的步骤可能因使用的开发工具和具体情况而异,以下是一般的流程:
1. 项目配置 :确保应用程序项目已经完成开发和测试,所有依赖项和资源都已正确配置。
2. 选择部署项目类型 :在开发环境中,选择创建部署项目,如 Visual Studio 中的“安装项目”。
3. 添加项目输出 :将应用程序项目的输出文件(如可执行文件、库文件等)添加到部署项目中。
4. 配置安装选项 :设置安装路径、启动菜单项、快捷方式等安装选项。
5. 生成 .msi 文件 :编译部署项目,生成 .msi 安装文件。
4.3 安装应用程序
安装应用程序非常简单,只需将生成的 .msi 文件复制到目标计算机,然后双击该文件,Microsoft Windows 安装程序将自动完成应用程序的安装过程。
4.4 部署流程图
graph LR
A[开发应用程序] --> B[项目配置]
B --> C[选择部署项目类型]
C --> D[添加项目输出]
D --> E[配置安装选项]
E --> F[生成 .msi 文件]
F --> G[复制 .msi 文件到目标计算机]
G --> H[双击 .msi 文件安装]
5. 总结与实践建议
5.1 总结
本文全面介绍了用户控件、Web 用户控件、多线程编程、Windows 服务、Web 服务的开发以及应用程序的部署。用户控件和 Web 用户控件为开发提供了可复用的组件,多线程编程可提高程序的性能和响应性,Windows 服务适用于后台支持服务,Web 服务用于 Web 应用的数据交互,而应用部署则是将开发成果交付给用户的关键步骤。
5.2 实践建议
- 多做练习 :通过完成文中提到的练习,如创建闹钟用户控件、多线程应用程序等,加深对知识的理解和掌握。
- 测试与调试 :在开发 Windows 服务和 Web 服务时,要进行充分的测试和调试,确保服务的稳定性和正确性。特别是 Windows 服务,在测试阶段应将启动模式设为手动,避免出现问题导致系统不稳定。
- 遵循最佳实践 :在开发过程中,遵循相关的编程规范和最佳实践,如合理使用线程同步、正确处理事件日志等,提高代码的质量和可维护性。
通过不断学习和实践,相信你能够熟练掌握这些技术,开发出高效、稳定的应用程序。
超级会员免费看
5万+

被折叠的 条评论
为什么被折叠?



