先來廢話:
.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