先来废话:
.NET框架的主要目标之一就是简化部署,为此使用.NET开发的应用程序支持XCOPY部署,这在以前是不可想象的(当然说的是微软系列)。在.NET之前,安装一个组件(例如一个COM组件)意味着不仅要把组件复制到适当的目录,而且还要执行注册表修改之类的操作。但现在有了.NET,安装一个组件的全部操作就是将程序集复制到客户应用程序的bin目录,由于程序集包含完整的自我描述信息,应用程序可以立即开始使用程序集。这一切之所以成为可能,是因为编译器将标识符和元数据信息嵌入到了编译好的模块之中,而CLR利用这些信息来装入程序集的适当版本。标识符包含了装入和运行模块、查找程序集引用的其他模块所需的所有信息。这种安装也称为无干扰(Zero-Impact)安装,因为系统不会因为修改注册表、配置组件而受到影响;另外,无干扰安装也使得组件卸载操作不会对系统产生任何意外的影响,卸载组件时只要从特定的目录删除某些文件就可以了。
如何进行XCOPY部署呢?
以一个WinForm应用程序为例,在命令行中使用XCOPY命令将必要的文件复制到客户端的特定目录即可。 在命令行中输入XCOPY/?可以看到如下信息,这是XCOPY的使用方法:
XCOPY命令选项 XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W] [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U] [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/EXCLUDE:file1[+file2][+file3]...] source 指定要复制的文件。 destination 指定新文件的位置和/或名称。 /A 只复制有存档属性集的文件, 但不改变属性。 /M 只复制有存档属性集的文件, 并关闭存档属性。 /D:m-d-y 复制在指定日期或指定日期以后更改的文件。 如果没有提供日期,只复制那些源时间 比目标时间新的文件。 /EXCLUDE:file1[+file2][+file3]... 指定含有字符串的文件列表。每一个字符串 必须在文件的单独行中。如果有任何 字符串与要被复制的文件的绝对路径 相符,那个文件将不会得到复制。 例如,指定如 \obj\ 或 .obj 的字符串会排除 目录 obj 下面的所有文件或带有 .obj 扩展名的文件。 /P 创建每个目标文件前提示。 /S 复制目录和子目录,除了空的。 /E 复制目录和子目录,包括空的。 与 /S /E 相同。可以用来修改 /T。 /V 验证每个新文件。 /W 提示您在复制前按键。 /C 即使有错误,也继续复制。 /I 如果目标不存在,又在复制一个以上的文件, 则假定目标一定是一个目录。 /Q 复制时不显示文件名。 /F 复制时显示完整的源和目标文件名。 /L 显示要复制的文件。 /G 允许将没有经过加密的文件复制到 不支持加密的目标。 /H 也复制隐藏和系统文件。 /R 覆盖只读文件。 /T 创建目录结构,但不复制文件。 不包括空目录或子目录。/T /E 包括 空目录和子目录。 /U 只复制已经存在于目标中的文件。 /K 复制属性。一般的 Xcopy 会重置只读属性。 /N 用生成的短名复制。 /O 复制文件所有权和 ACL 信息。 /X 复制文件审核设置(隐含 /O)。 /Y 复制文件审核设置(隐含 /O)。 现存目标文件。 /-Y 导致提示以确认改写一个 现存目标文件。 /Z 用重新启动模式复制网络文件。
包含XCOPY命令的批处理文件的实际应用:
在开发.NET WinForm应用程序时,如何在局域网内部部署应用程序?使用包含XCOPY命令的批处理文件也许是最方便的方法,在客户端机器上建立批处理文件还可以实现软件的自动更新功能,下面的例子即实现客户端的自动更新。有一个小问题先解决以下,客户端机器的环境设置千差万别,操作系统也可能从Win9X到Win2003都有,从客户端机器访问服务器需要输入用户名和密码,有的甚至无法保存该用户名密码,这时候怎么办?需要在批处理文件中激活到服务器的网络连接,这时候可以利用IPC$(注意IPC$是NT/2000后才有的功能)。IPC$(Internet Process Connection)是共享"命名管道"的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。可以使用net use \\(Server IP或Server Name)\ipc$ password /user:user 来建立到服务器(Server IP或Server Name)的连接,但是应该注意的一点是,使用IPC$在同一时间内,两个IP之间只允许建立一个连接,所以在使用该命令建立连接之前最好使用net use * /del 删除可能存在的到服务器的连接。下面是一个完整的批处理文件:
完整的批处理文件示例 @ECHO ———————————————————— @ECHO 开始准备更新…… @ECHO ———————————————————— @ECHO 删除到服务器的所有连接…… @NET USE * /del /Y @ECHO ———————————————————— @ECHO 激活到服务器的连接…… @NET USE \\waxdoll\ipc$ password /user:user @ECHO ———————————————————— @ECHO 正准备复制文件,请稍候…… @ECHO ———————————————————— @XCOPY \\waxdoll\Debug E:\WinForm /Y/E @ECHO ———————————————————— @ECHO 更新完成! @ECHO ———————————————————— @Pause