c#

位置:IT落伍者 >> c# >> 浏览文章

与VB .NET一起使用.NET Framework


发布日期:2018年09月10日
 
与VB .NET一起使用.NET Framework

使用NET FrameworkMicrosoft Visual Basic开发人员可以创建健壮的在先前的Visual Basic版本中很难编写的应用程序 本文将讨论使用NET Framework的好处并且将包括一些功能强大的Visual Basic开发人员可以与该框架一起使用的特性包括多线程和线程池(thread pooling)Windows服务和文件系统监控等

为什么使用框架

单词框架(framework)有几种含意在这种情况中它指的是创建和运行应用程序的基础拥有这样的基础使得创建应用程序变得更容易而同时使用了一个一致的简化的程序设计模型

作为一个Visual Basic 开发人员你对于这种程序设计语言感觉很满意它使得创建各种应用程序变得很容易Visual Basic语言本身提供了固有的数据类型如 Integer Long和String以及一些最常用的函数如字符串处理和数据类型转换等当你的应用程序变得更复杂时你可以使用Win API来完成标准的Visual Basic函数所不能实现的功能如获取任意的注册键和数值在许多情况中你还可以使用COM(Component Object Model组件对象模型)组件库来扩展应用程序的功能最明显的例子是ADO(ActiveX Data Objects)库你的应用程序可以使用它来进行数据访问

虽然Visual Basic足够灵活可以提供这些不同的可扩展性机制但这种灵活性仍然需要你学习几种复杂的API体系结构你需要了解Win如何工作以及如何在Visual Basic中调用它们这可能会是一个既费时又容易出错的任务你还需要了解如何在Visual Basic中使用各种COM组件每个COM组件都有一个不同的对象模型

最后当你使用Win APIADO也可能使用许多其他COM组件创建自己的Visual Basic应用程序时你需要管理这些应用程序的部署以及它们的相关性一个典型的Visual Basic应用程序的相关性列表所包括的远远多于Visual Basic运行时(runtime);它必须包括应用程序使用的所有对象库如ADO

公共框架背后的想法是解决这些问题并使得用户创建健壮的应用程序变得更容易而无需学习多种不同的API体系结构并且无需部署和处理多种对象库的版本问题

什么是NET Framework

术语NET Framework指的是构成Microsoft NET平台开发基础的一组技术这一组中的关键技术是运行时(runtime)和类库

运行时负责管理代码在执行时向它提供服务这与Visual Basic 运行时的作用类似NET程序设计语言包括Visual Basic NETMicrosoft Visual C#C++管理的扩展以及多种来自不同开发商的程序设计语言通过一组公共的统一类来利用各种服务和特性

NET统一类提供了创建应用程序的基础而不管你使用何种语言无论你只是简单地连接一个字符串还是创建一个Windows服务或多层的基于网络的应用程序你都要用到这些统一类

统一类为访问平台的功能性提供了一种一致的方法一旦你学会了使用类库你就会发现所有任务都遵循同一个一致的体系结构要编写自己的应用程序你无需学习和掌握不同的API体系结构

由于NET Framework部署Visual Basic NET应用程序变得更容易了与Visual Basic 应用程序不同你无需配置各种相关性如单独的数据访问库XML语法分析器和网络API因为所有这些功能都是NET Framework的组成部分

通过在统一的集成的框架上创建自己的应用程序你可以实现学习这种框架所花费时间的最大回报并且你将拥有更多容易部署和使用的健壮的应用程序

NET Framework与Visual Basic NET

Visual Basic 运行时在简化许多公共的程序设计任务方面非常重要但是简化这一层意味着在拥有Visual Basic可以使用的打包程序之前你不能使用新的操作系统特性如DirectX作为一个Visual Basic开发人员你从NET Framework获得的最重要的益处是可以使用一致的程序设计模型既直接又容易地访问NET平台这意味着你可以使用Visual Basic NET创建很难或不可能使用Visual Basic 创建的应用程序作为一个Visual Basic 开发人员现在你将对能够使用与其他平台语言相同的特性和功能而赞赏不已例如为了创建Windows服务你无须再用Microsoft Visual C++来编写它你也无须求助于黑客或组装机你可以优雅干净容易地使用Visual Basic NET完成这项工作为了给你一些使用NET Framwork的例子我们将讨论在你的应用程序中可能需要执行的个常见任务跟蹤与事件记录多线程文件系统监控和创建Windows服务

跟蹤与事件记录

当创建一个健壮的应用程序的时候你必须密切注意诊断和故障排除机制代表性地这包括编写处理打开输出目标(事件记录或文件)的跟蹤组件编写跟蹤消息和关闭输出目标然后通过自己的代码调用关于这个组件的方法将文本传递给记录你将所有的时间和精力花在了创建跟蹤和记录子系统上这最终并不会对解决商务问题有所贡献但这是创建应用程序所必需的

NET Framework包括类和其他数据类型通过向你提供记录基础设施使得记录跟蹤消息变得很容易给出了用于跟蹤的NET Framework类

类是SystemDiagnostics名称空间的一部分Trace类提供了几个共享的方法例如Write方法允许你记录特定消息而Assert方法允许你在特定的条件为假的情况下记录一条消息Trace类将消息输出到Listeners集合中的对象这个集合中的每个对象都属于继承自TraceListener的一个类EventLogTraceListener 将消息写入事件记录而TextWriterTraceListener则是将消息写入到一个文本文件中默认情况下DefaultTraceListener的一个实例被添加到Trace类的Listeners集合中

除了标准的监听程序以外你可以实施自己跟蹤监听程序例如你希望接收来自在防火墙后面的远程机器上运行的应用程序的跟蹤输出你可以编写一个跟蹤监听程序通过HTTP全球向你的服务器发送跟蹤消息这将会影响你的应用程序的性能但只会在启用跟蹤时才会对性能有所影响

代表性地你需要有能力在编译的二进制文件中包括或去除跟蹤代码为了在Visual Basic 中做到这一点你需要使用编译常量并在#If语句中包含所有的跟蹤代码这使得代码很难理解和维护利用NET Framework你只需在项目属性(Project Properties)对话框中将TRACE编译常量设为on或off状态你无需在#If语句中包括跟蹤代码

另一个普遍期望的跟蹤特性是跟蹤水平设置这包括不同的跟蹤设置例如 Severe(严重)Error(错误)Warning(警告)和Information(信息)这些设置对记录哪些信息进行控制你可以使用跟蹤组件启动时所读取的注册表数值对此进行控制对于NET Framework这是完全内置的功能你可以设置一个注册表数值来控制你当前的应用程序的记录水平比如只有在跟蹤水平被设置为Severe(严重)的情况下才使用TraceWriteIf和TraceWriteLineIf来记录消息

集成的跟蹤和记录特性极大地增强了生产力因为你只需使用内置的特性将精力集中在编写真正的应用程序代码上

多线程应用程序

NET Framework的一个很重要的特性是可以在不使用第三方工具或不支持的Visual Basic技巧情况下使用Visual Basic创建多线程应用程序NET Framework的多线程支持是由SystemThreading名称空间中的类和接口提供的因此所有的NET语言都能够以相同的方式创建和处理线程SystemThreadingThread是一个核心类提供了对创建和控制线程的支持要创建一个线程你可以创建一个新的SystemThreadingThread对象将构造函数传递给ThreadStart代理这个代理提供了这个线程开始执行的方法当你准备启动这个新的线程时可以调用ThreadStart() (请参阅清单)

当你开始创建多线程应用程序时你很快就会认识到需要控制对共享资源的访问如共享的类变量NET Framework还包括几个类和数据类型你可以使用它们对两个线程执行的动作进行同步

在最简单的情况中你由一个需要从不同的线程中进行更新的共享变量要这样做你可以使用SystemThreadingInterlocked类例如你可以通过编写InterlockedIncrement(num)或InterlockedDecrement(num)分别使名为num的共享变量递增或递减你还可以使用Interlocked将变量设为某一特定值或检查两个变量是否相等除了这种简单情况以外你可以使用NET Framework类来执行更复杂的线程同步如事件和互斥体的同步所有都来自于NET Framework内部而无须使用Win API

Imports SystemIO

注释The namespace SystemThreading

注释contains the Thread class

Imports SystemThreading

Module Module

Private count As Long

Sub Main()

注释Create the ThreadStart delegate

Dim tStart As ThreadStart = New _

ThreadStart(AddressOf StartCounting)

注释Create the thread

Dim t As Thread = New Thread(tStart)

ConsoleWriteLine(Enter q to quit)

tStart() 注释start the thread

While (ConsoleRead() <> asc(q))

注释repeat the loop until the user enters q

End While

tStop() 注释tell thread to stop processing

tJoin() 注释wait until the thread finishes

End Sub

Sub StartCounting()

Do

注释use InterlockedIncrement in case

注释another thread is accessing the same variable

InterlockedIncrement(count)

ConsoleWriteLine( _

After incrementing count is : count)

ThreadSleep()

Loop

End Sub

End Module

清单 使用Visual Basic NET创建线程

你创建了一个新线程将它传递给一个ThreadStart代理然后调用ThreadStart()启动这个线程你可以通过调用ThreadStop()来中止这个线程然后调用ThreadJoin()等待它完成关闭操作一个线程可以使用SystemThreadingInterlocked来使变量递增或递减

此外NET Framework提供了一个方便的机制来对工作排队并将起分配给线程池中的某个线程在处理多个并发工作项目或工作请求的服务器应用程序中这非常有用例如对于等待输入文件然后将它们导入到数据库中去的应用程序可能会对每个输入文件进行排队以在线程池中的某个单独的线程上进行处理SystemThreadingThreadPool类允许你使用共享的QueueUserWorkItem方法对工作进行排队以前要这样做你必须得创建和管理自己的线程池你又需要在基础设施工作而不是在解决商务问题上花大量的时间和精力

文件系统监控

我曾经遇到过一些应用程序需要等待和处理某个特定目录中的文件例如将数据从文件导入到数据库中去的应用程序数据文件可以从某个大型机上下载或者被转移到某个输入目录中该应用程序将它们导入到数据库中你不用经常地轮询该目录检查是否有新文件可以等待生成新文件的通知你可以在Visual Basic 中使用Win API来做到这一点而在Visual Basic NET中你可以使用NET Framework类来做这项工作但是在NET中实施文件监控与在NET中完成其他工作的方法更加一致因此学习曲线是最小的

你可以使用SystemIOFileSystemWatcher NET类对文件系统进行监视它提供了一些属性允许你设置监控的路径指定是对文件还是子目录层次的变化感兴趣SystemIOFileSystemWatcher还允许你指定需要监控的文件名和文件类型(例如*xml是指监控所有XML文件的变化)最后你可以指定感兴趣的变化类型例如只对新建文件文件属性的变化或文件大小的变化(请参阅清单)感兴趣

在你设置了监控内容后你需要钩住用于感兴趣的各种事件的事件处理程序FileSystemWatcher事件有ChangedCreatedDeletedError和Renamed要处理某个事件首先你需要编写一个与FileSystemEventHandler代理相同声明的事件处理程序然后将这个处理程序添加到FileSystemWatcher类中这个基于代理的体系结构允许你为同一个事件添加多个处理程序或者对于多个事件使用同一个处理程序而你不能使用Visual Basic 做到这一点

注释SystemIO contains the

注释file monitoring classes and types

Imports SystemIO

Module Module

Sub Main()

注释FileSystemWatcher does the real work

Dim fw As New FileSystemWatcher()

注释WaitForChangedResult is what you

注释get back when a change occurs

Dim result As WaitForChangedResult

注释set the path to monitor

fwPath = C:WINNT

注释tell it whether to watch files or directories

fwTarget = WatcherTargetFile

注释tell it whether to include subdirs

fwIncludeSubdirectories = False

注释hook up handlers

AddHandler fwCreatedNew FileSystemEventHandler(AddressOf OnFileNotify)

注释enable the watcher

fwEnabled = True

Do

ConsoleWriteLine(Beginning to monitor)

注释this is where we actually wait

注释waiting blocks execution for the specified timeout

result = fwWaitForChanged(WatcherChangeTypesAll )

ConsoleWriteLine(Hit Enter to continue q to quit)

Loop While (ConsoleReadLine <> q)

End Sub

注释This is the delegate that gets

注释called when a file is created

Public Sub OnFileNotify(ByVal source As Object ByVal e As FileSystemEventArgs)

ConsoleWriteLine( Notification received for file change type is _

eFullPath eChangeType)

End Sub

End Module

清单 使用FileSystemWatcher监控某个文件夹是否有新文件

你可以创建一个FileSystemWatcher然后设置它的属性你可以使用AddHandler将FileSystemEventHandler代理与各种FileSystemWatcher事件关联起来如Created然后你就可以启用FileSystemWatcher然后调用WaitForChanged该调用将在变化发生或达到指定的超时时返回

创建Windows服务

当你要创建一个Windows服务时你必须使用Visual C++或在Visual Basic中使用srvanyexe或第三方工具来创建该服务任何一种方法你都没有在Visual Basic中编写自己的服务你只是正在Visual Basic运行时的外部添加更多从属组件

如果你使用C++或C语言在不使用活动模版库(Active Template Library)的情况下从头编写一个Windows服务你将不得不编写一小段代码来协调你的服务与服务控制器(Service Control ManagerSCM)之间的往来通信SCM用来处理服务的启动暂停继续和停止NET Framework通过提供SystemServiceProcessServiceBase类使得实现一个服务变得很容易要编写一个服务你可以从这个类继承重载它的某些方法设置它的属性然后就大功告成了!

你可能要重载的一些方法包括OnStartOnStopOnPause和OnContinue通常你需要载启动工作线程(worker thread)的位置重载OnStart在需要取消这个工作线程的位置重载OnStop在你创建了自己的服务后你就可以使用SCM安装和注册这个服务这是另一个领域NET Framework中的基类提供了大部分所需的工作你可以创建一个继承自SystemConfigurationInstallInstaller的类从SystemServiceProcessServiceInstaller中例示对象然后设置它的属性如服务启动模式和服务名称这使得NET安装实用工具installUtilexe能够安装(和删除)你的服务而你无需编写额外的代码

当你开始使用Visual Studio NET时你将会发现Visual Studio NET使得使用NET Framework变得更容易Visual Studio NET允许你创建Windows服务(拥有安装程序(installer))监控文件系统的变化写入事件记录 所有都是使用设计器和组件而不是编写代码来完成例如要将一个安装程序添加到自己的服务项目中你只需选中服务设计器避免然后单击属性(Properties)窗口(见图)底部的添加安装程序(Add Installer)这将添加一个新模块ProjectInstallervb该模块包括安装该服务所需的全部代码你可以使用设计器(见图)对安装选项如启动模式进行自定义

结论

NET Framework使得你能够利用Visual Basic NET很容易地开发健壮地应用程序它使得你可以将重点放在学习一种相容的程序设计模型上并且使得你可以直接访问底层的NET平台利用Visual Basic NET和NET Framework你可以使自己的应用程序达到前所未有的水平

上一篇:用C#制作一个最简单的Web Service

下一篇:公布.NET Framework 2.0升级3.5方案