技术开发 频道

.NET Framework 中的无接触部署

【IT168 技术文档】

  您是否曾经必须部署 Visual Basic 客户端服务器应用程序?或者曾经必须部署依赖于 COM 注册的 Win32 应用程序?企业桌面环境中的正确安装一直受到各种问题的困扰,这其中既有试图使所有用户升级这样的简单问题,也有较为复杂的 DLL 版本控制问题。

与 Web 应用程序相比,桌面应用程序有很多优点,具体表现在以下几个方面:
丰富的用户界面 (UI)
较快的响应速度
较好的性能
能够脱机运行
可以有效地使用边缘资源(客户机)
易于同本地应用程序和 API 集成

  尽管桌面应用程序具有以上优点,但由于 Web 应用程序使应用程序的部署和更新相对容易,因此在过去几年中得到了广泛的应用。

  Microsoft 准备通过 .NET Framework 将 Web 应用程序在部署和维护方面的所有优点都集成到桌面应用程序中。DLL 版本控制问题也得到了解决 - 在默认情况下,使用 .NET Framework 生成的应用程序彼此完全孤立,并从各自的专用应用程序目录中检索其 DLL。DLL 仍然可以在多个应用程序之间共享,但这并非使用系统注册表实现,而是将共享的 DLL 存储在 .NET Framework 全局程序集缓存中,该程序集缓存可加载给定 DLL 的多个版本并跟踪版本与应用程序之间的匹配关系。在实际部署应用程序的过程中,.NET Framework 允许系统管理员按照部署和更新 Web 应用程序(通过远程 Web 服务器)的方式部署应用程序和应用程序更新。此项技术称为无接触部署,是本文要论述的中心内容。

使用 Web 服务器的无接触部署

  使用无接触部署,可以下载、安装和直接在用户计算机上运行 Windows 窗体应用程序(使用 .NET Framework 的 Windows 窗体类生成的桌面应用程序),而无须改变注册表或共享的系统组件。

工作原理

  .NET Framework 安装提供了一个挂接 Internet Explorer 5.01 和更高版本以侦听所请求的 .NET 程序集的机制。在请求期间,可执行程序被下载到磁盘上称为程序集下载缓存的位置。然后,名为 IEExec 的进程在具有有限安全设置的环境中启动该应用程序。

  这是一个非常简单的 Windows 窗体应用程序,用户可以使用它管理任务列表。这些任务可用于错误跟踪、IT 疑难解答,也可用于任务列表(该列表与 Outlook XP 或 Visual Studio .NET 中的列表相似)。

  首先,在 Visual Studio .NET 中打开此应用程序。任务管理应用程序是在 Visual Basic .NET 中使用 Windows 窗体和名为 TaskMgmtWS 的 XML Web Service(它使用 ADO.NET 与 Access 数据库通信以存储任务)实现的。

  任务管理应用程序使用 TaskMgmtWS Web 服务更新 DataGrid Windows 控件。应用程序首先实例化一个名为 ws 的 XML Web Service 对象。接着调用 Web 方法 GetTasks(),获取任务的 ADO.NET 数据集。然后将任务数据集分配给 DataGrid Windows 控件中的 DataSource 属性。

' 调用 Web 服务
 Dim ws As localhost.Service1 = New localhost.Service1() Dim ds As DataSet = ws.GetTasks()
 ' 将生成的数据集绑定到 DataGrid 控件
DataGrid1.DataSource = ds DataGrid1.DataMember = "Tasks"

  应用程序返回时,DataGrid 被更新,应用程序也将更新。此时,我们遇到了在基于网络的应用程序中常见的问题。第一次加载期间,应用程序将生成一个网络调用,可能需要几秒钟才能完成。

提高 Windows 窗体响应速度

  要提高应用程序的总体响应速度,可以利用后台线程。已更新的应用程序首先调用辅助线程来实例化一个 XML Web Service 对象。Web 服务实例化后,我们将使用 MethodInoker() 来安全地更新 UI。

从 Form Load 事件中的辅助线程开始:

' 使用后台辅助线程生成 Web 服务调用, ' 以提高第一次窗体加载过程中应用程序 ' 的总体响应速度。 ThreadPool.QueueUserWorkItem(New WaitCallback
(AddressOf GetTasksWebServiceBackground))

在 Windows 窗体运行的同时,编写一个作用于 XML Web Service 调用的后台线程:

Private Sub GetTasksWebServiceBackground(ByVal data As Object)
 '调用 Web 服务
Dim ws As localhost.Service1 = New localhost.Service1() m_ds = ws.GetTasks()
 '更新 Windows 窗体数据网格
Dim mi As New MethodInvoker(AddressOf UpdateDataGridForm)
Dim ia As IAsyncResult = BeginInvoke(mi) Cursor = Cursors.Default
End Sub

  为了说明如何将应用程序部署到 Web 服务器上,我们将任务管理应用程序部署到 Tasks Web Service Web 文件夹中。首先将生成文件夹更改为 TaskMgmtWS Web Service IIS 虚拟目录。方法是打开“TaskManagement Property Pages”(TaskManagement 属性页)对话框,然后将输出路径设置为“..\TaskMgmtWS\”。

  将生成结果路径设置为 Web 服务器后,可以通过简单的重新编译来部署此应用程序。应用程序生成后,我们可打开 Internet Explorer 并浏览到应用程序。

  应用程序现已通过 HTTP 下载并安装到程序集下载缓存中。运行该应用程序之前,将检查安全策略以确保应用程序拥有执行其操作的权限。

  上面介绍了如何通过 Web 服务器运行该应用程序,下面就让我们更改该应用程序,看看对它进行升级有多么容易。选择 DataGrid,可以使用 Auto Format(自动套用格式)属性快速更改背景样式。

  然后重新生成应用程序,以更新 Web 服务器上的 .exe 文件。最妙的是当用户请求返回到 Windows 窗体时,应用程序代码将自动更新。.NET Framework 将自动检查程序集的时间戳,查看是需要再次下载该程序集,还是只需通过用户的程序集下载缓存来运行该程序集。

0
相关文章