Ví dụ , khi bạn cài đặt 1 version mới của 1 ứng dụng nào đó hay 1 ứng dụng không liên quan gì tới 1 ứng dụng đã cài trong máy của bạn , quá trình cài đặt sẽ copy version của dlls vào thư
Trang 1Đóng gói ứng dụng bằng Visual Studio 2005
Phần 1:
1 Giới thiệu:
- Có một thời trước đây , đa số máy tính người dùng có một thời kỳ khủng hoảng trong việc cài đặt ứng dụng Windows Ví dụ , khi bạn cài đặt 1 version mới của 1 ứng dụng nào đó hay 1 ứng dụng không liên quan gì tới 1 ứng dụng đã cài trong máy của bạn , quá trình cài đặt sẽ copy version của dlls vào thư mục
hệ thống và thay đổi thiết lập trong registry Quá trình cài đặt này có thể gây nguy hiểm ứng dụng khác trong cùng máy client đó , đặc biệt nếu tồn tại 1 ứng dụng đang dùng chung với các componient Nếu các componient đó tương thích lùi với các phiên bản trước , that’s okei , nhưng đa số trường hợp nó không có khả năng tương thích lùi với các phiên bản cũ hơn Thì lúc đó bạn buộc phải nâng cấp các phần mềm khác , hoặc tệ hơn là không dùng được nữa Vấn đề khó chịu đó được gọi là DLL Hell
- Nói thêm về cơn ác mộng DLL Giả sử kịch bản sau : bạn cài đặt ứng dụng A của trên máy của bạn , nạp một số DLL của Windows Nó hoạt động ngon lành trong nhiều năm Sau đó bạn cài đặt ứng dụng B cũng trên máy của bạn và thình lình không chờ đợi , ứng dụng A “sụm bà chè” không nói không rằng
Mà ứng dụng B không dính dạng ứng dụng A Việc gì xảy ra ? Cuối cùng bạn phát hiện ra là : ứng dụng B
đã thay thế một số DLL mà ứng dụng A cần đến , và thình lình ứng dụng A bằt đầu lảo đảo và bất động
- Theo nguyên tắc , DLL phải tương thích lùi (backward-comatible) Vì DLL mới được thêm vào máy , thì ứng dụng cũ xưa thình lình được kết nối với 1 DLL không tương thích với những gì ứng dụng chờ đợi và thế là xong đời Hiện tượng này khiến cho khách hàng windows phải nâng cấp chương trình hiện hữu và cũng là 1 trong những lý do bảo rằng các máy sử dụng Windows bất ổn Với assembly của NET thì cơn
ác mộng sẽ biến mất
- Bạn muốn triển khai ứng dụng của bạn bằng một chương trình cài đặt có thể chép file thực thi , tạo shorcut , thêm các thiết lập Registry … Có nhiều chương trình phục vụ cho việc đóng gói phần mềm trở nên dễ dàng hơn bao giờ hết , ví dụ như : WiseInstall for net, InstallShield, InstallAnywhere for net , Nsis …
- Hôm nay mình sẽ giới thiệu 1 công cụ hỗ trọ đóng gói phần mềm đó là Microsoft Visual Studio 2005
- Với mô hình triển khai “zero-touch” của NET , bạn có thể chép file ứng dụng đã được biên dịch sang bất kỳ máy tính nào khác mà không phải đăng ký các thành phần này hay chỉnh sửa các Registry Tuy nhiên , hầu hết các ứng dụng chuyên nghiệp đều đòi hỏi có 1 chương trình cài đặt tự động để chép các file vào vị trí thích hợp và thêm các shortcut của ứng dụng vào Start Menu hay với nhiều cấu hình tự động khác nữa Microsoft Visual Studio NET cho phép xây dựng kiểu chương trình cài đặt như thế với một dự án cài đặt hay người ta gọi là (Setup Project)
- Setup Project là 1 kiểu Project đặc biệt trong Visual Studio NET Khác với kiểu Project khác , nó thuộc dạng không đặc thù ngôn ngữ Thay vì viết mã kịch bản cài đặt , bạn cấu hình tùy chọn cài đặt thông qua GUI Sau đó Project này được biên dịch thành 1 ứng dụng cài đặt Windows Installer (file msi)
Các tính năng mà công cụ đóng gói của VS.net hổ trợ :
- Chương trình tự động phát sinh cùng lúc cả Install và Uninstall lúc Compile
- Tạo Shortcut
Trang 2- Cho phép tạo chương trình Install gồm nhiều đồ án, nhiều chương trình thực thi và nhiều thư viện
- Tùy chọn đường dẫn cài đặt
- Kiểm soát được tình huống cài đặt :
VS.net hỗ trợ 6 kiểu tạo file setup như sau:
1 Setup Project : tạo bộ đóng gói cho ứng dụng Windows (hay còn gói là ứng dụng chạy trên Desktop)
2 Merge Module Project : Tạo ra file msm , đóng gói các components cho phép bạn chia sẽ các
components đó giữa nhiều Project hoặc nhiều ứng dụng
3 CAB Project : Cho phép bạn tạo 1 file cab để nén ActiveX controls chứ không phải những ứng dụng, tuy nhiên có thể được download từ Web server tới trình duyệt web
4 Web Setup Project : Cho phép bạn triển khai 1 ứng dụng Web tới web server Bạn tạo 1 Web Setup project, build nó tạo ra file đóng gói , copy file đó tới Web Server, và chạy file đó để cài đặt ứng dụng này trên server, sử dụng những Setting định nghĩa Web Setup project của bạn
5 Smart Device CAB Project : tạo Cab project để cài đặt trên ứng dụng trên thiết bị di động
6 Setup Wizard : nếu bạn không rõ mình dùng loại đóng gói nào thì dùng lựa chọn này để dùng trình thuật sỹ Wizard sẽ hướng dẫn chúng ta đi từng bước trong suốt quá trình tạo file đóng gói Áp dụng cho mọi loại ứng dụng , kể cả ứng dụng Web
Chúng ta xét 2 hổ trợ đó là Setup Wizard và Setup Project Thực ra chỉ cần tìm hiểu Setup Wizard là đủ
vì Setup Wizard đã có bao hàm Setup Project
2 Một số thuật ngữ trong bài viết
Một số thuật ngữ chỉ có áp dụng trong nội dung bài hướng dẫn này thôi , ngoài phạm vi bài này, ý nghĩa của các từ có thể khác nhiều đi
Target Machine = Target Computer = Client: máy tính của khách hàng chạy file setup do bạn tạo ra Application : chương trình do bạn viết ra và muốn đóng gói lại
Setup : là 1 ứng dụng hay quá trình cho phép bạn đóng gói ứng dụng của bạn thành 1 định dạng deploy , với định dạng easy-to-deploy bạn có thể dễ dàng install ứng dụng vào máy client
easy-to-Deploy : triển khai chương trình tới máy client
Deployment : là quá trình đem ứng dụng của bạn và install nó vào máy khác , đa số dùng thêm 1 ứng dụng setup khác
Project : là Project mình muốn đóng gói lại
Setup Project : là Project mình đang thao tác , cấu hình project để tạo file setup
Trang 3Setup File : là file kết quả tạo ra khi build Setup Project , file này để cài đặt trên Target Computer Windows Installer :
3 Tìm hiểu cơ chế đánh phiên bản của NET
Như bạn đã biết , NET Runtime không buồn kiểm tra phiên bản đối với private assembly Nhưng khi
“chơi” với shared assembly thì vấn đề phiên bản lại trở thành quan trọng , bây giờ ta tìm hiểu cơ chế đánh số phiên bản (gọi là versioning ) và kiểm tra đối với shared assembly
Trên NET các shared assembly được nhận diện được nhận diện duy nhất thông qua tên và version GAC (Global Assembly Cache ) cho phép các phiên bản khác sống side-by-side , nghĩa là phiên bản cũ vẫn hiện diện cùng với phiên bản mới Như vậy các ứng dụng có thể dùng bất cứ phiên bản nào mà nó thích , tuỳ thuộc ứng dụng đó , cũ cũng có , mới cũng có sẵn
Một con số đánh dấu version của 1 assembly trong giống như sau : 1:0:2204:21 , nghĩa là 4 con số phân cách bởi dấu ‘:’ 2 số đầu (1:0) được gọi là major và minor Con số thứ 3 là số build và con số thứ 4 là số revision (số chỉnh sửa duyệt lại)
Khi 2 assemply có số major và minor khác nhau thì được xem là không tương thích (incompatible) Khi các assembly khác nhau số Major và minor , thì bạn có thể chắc chắn là có nhiều thay đổi đánh kể (như đổi tên các hàm hành sự , kiểu dữ liệu , kiểu thông số bị thay đổi , v.v… Do đó , nếu ứng dụng client yêu cầu gắn kết với phiên bản 2.5 nhưng GAC chỉ có phiên bản 2.0 thì yêu cầu gắn kết thất bại (trừ khi bản chỉnh sửa tập tin cấu hình của ứng dụng)
Khi 2 version cùng số major và minor nhưng lại có số build khác nhu thì NET Runtime giả định chúng có thể tương thích với nhau (tương thích nhưng không bảo đảm lắm) Cuối cùng nếu 3 số đầu giống nhau, chỉ khách số revision (còn gọi là QFE Quick Fix Engineering) thì được xem là hoàn toàn tương thích
Số QFE dành cho những lần sửa chữa bug Nếu bạn sửa 1bug và cho biết là DLL của bạn hoàn toàn tương thích đối với phiên bản hiện hữu , thì bạn phải tăng con số revision Khi 1 ứng dụng nạp 1
assemply , thì nó cho biết version major và minor muốn nạp , và AssemblyResolver sẽ tìm ra con số build
và revision cao nhất
4 Cách 1 : Các bước tạo một chương trình setup bằng Setup Wizard
B1 Trong Solution Explorer của VS.net , right click vào Solution
Trong menu popup, vào mục Add –> New project Xuất hiện hộp thoại Add new project (H1 và H2)
Trang 4Hình 1
Trong hộp thoại Add new project:
Trang 5Hình 2
B2
- Bên trái là Project Types: Chọn Other Project Types –> Setup and Deployment
- Bên phải là Templates: Chọn Setup Wizard
Đặt tên Project mới vào trường name
Chọn đường dẫn cần lưu thư mục tại trường Location
Sau khi click Ok, VS.net sẽ tự động hiển thị hộp thoại là Setup Wizard (1 of 5) Click chọn Next (H3)
Trang 6Hình 3
Hình 4
B3 Hộp thoại thứ 2 là Setup Wizard (2 of 5) xuất hiện (H4)
Hộp thoại này cho phép chọn kiểu Project
Trong trường hợp này chúng ta giả sử đóng gói ứng dụng Windows nên đánh dấu check vào radio button : Create a setup for a Windows application
Còn nếu là ứng dụng Web thì ta chọn radio button : Create a setup for a web application
Next tiếp :
Trang 7Hình 5
B4 Hộp thoại thứ 3 là Setup Wizard (3 of 5) xuất hiện (H5)
Hộp thoại này chứa các loại output mà chúng ta có thể đưa vào file Setup
XXX là tên project cần đóng gói
Localized resources from XXX :
XML Serialization Assemblies from XXX :
Content Files from XXX : chứa toàn bộ file chứa trong project XXX , cái này không cần thiết phải chọn Primary output from XXX : chứa file exe và file dll của prject XXX , cái này tất nhiên phải chọn rồi Source files from XXX : chứa file source code của project cần đóng gói như file css , vb , cpp …
Debug Symbols from XXX
Documentation Files XXX : (tài liệu XML của dự án, cái này liên quan đến các commnets viết theo qui tắc convention của Net) Có thể đưa vào hoặc không
Built Output from …: tạo ra file MSI
Primary Output (chứa các DLL và EXE do Project phía trên tạo ra) – đương nhiên phải đưa vào
Bạn muốn biết thêm thông tin thì có thể xem Description ở bên dưới của hộp thoại đó
Sau khi chọn xong nhấn Next
B5 Hộp thoại thứ 4 là Setup Wizard (4 of 5) xuất hiện (xem H6)
Trang 8Hình 6
Hộp thoại cho phép chọn file đính kèm theo như file Help , ReadMe …
Nếu muốn thêm file nào thì chọn Add à chọn đường dẫn của file đó Nếu không thì chọn Next B6 Hộp thoại thứ 5 xuất hiện Setup wizard (5 of 5) thông báo tóm tắt nội dung kết quả (xem H8)
Hình 7
Trang 9B7 Chọn Finish để kết thúc quá trình tạo file cài đặt
B8 Sau khi nhấn nút Finish trong Wizard cuối cùng thì màn hình (xem H8) hiện ra
Hình 8: File System Designer
Trong Solution Explorer xuất hiện thêm Project , người ta gọi là Setup Project
Tới đây có thể tạm thời gọi là xong , nhưng chúng ta phải qua một số bước cấu hình để tạo ra file setup đóng gói phần mềm theo ý mình
5 Cách 2 : Các bước tạo chương trình với setup bằng Setup Project
1 Mở Solution Explorer của VS.net ra, right click vào Solution
Trong menu thả ra, vào mục Add à New project –> Xuất hiện hộp thoại Add new project (H9)
Trang 10Hình 9
2 Trong hộp thoại Add new project (H10):
Trang 11Hình 10
- Bên trái có Project Types: Chọn Other Project Types –> Setup and Deployment
- Bên phải có Templates: Chọn Setup Project
- Đặt tên Setup Projectvào trường name
- Chọn đường dẫn cần lưu thư mục tại trường Location
3 Sau khi click Ok à VS.net sẽ tự động hiển thị Child window là File System ở dạng Explorer Chưa làm gì với Window này vội
Trang 13ListBox thứ hai chứa các loại đầu ra (output) lấy từ tên Project của combobox trên mà chúng ta có thể đưa vào toàn bộ Setup
Primary Output : chứa file exe và file dll của prject XXX , cái này tất nhiên phải chọn rồi
Localized resources :
Debug symbol : chứa một số file hỗ trợ debug của dự án
Content Files : chứa toàn bộ file chứa trong project XXX , cái này không cần thiết phải chọn
Source files : chứa file source code của project cần đóng gói như file css , vb , cpp …
Documentation Files : (tài liệu XML của dự án, cái này liên quan đến các commnets viết theo qui tắc convention của Net) Có thể đưa vào hoặc không
XML Serialization Assemblies :
Các thứ khác thì có thể xem Description của hộp thoại đó
Khi chọn xong những Project và ouput cần đưa vào Setup Project thì VS sẽ gói tất cả vào và khi cài đặt sẽ bung ra ở máy người dùng Đấy là nguyên lý, còn bây giờ chưa gói mà phải Build nhưng đừng Build vội
Có những thứ không tự động thêm vào Setup thì chúng ta phải dùng Child Window File System để thêm Chúng ta có thể tạo thêm các thư mục, Shortcut, đưa các file từ Source Machine đến Target
Machine,… vv
Phần 2:
1 Các loại Setup Editors
Khi bạn triển khai 1 ứng dụng , bạn muốn thực hiện 1 thao tác đặc biệt nào đó như thay đổi cấu trúc thư mục của ứng dụng trên máy client , thêm 1 số registry , và đặt một số điều kiệm kiểm tra đặc biết nào đó , thay đổi GUI trong quá trình cài đặt Với VS.NET bạn có thể làm điều đó rất dễ dàng VS.NET cung cấp một số editor sau :
File System Editor: editor này được dùng để add files vào gói cài đặt
Registry Editor: editor này bạn có thể thêm một số key vào registry của máy client
File Types Editor: editor này cho phép liên kết loại file nào đó tới ứng dụng của bạn
User Interface Editor: editor này cho phép bạn cấu hình một số GUI của dialog được show trong suốt quá trình cài đặt
Trang 14Custom action s Editor: với editor này , bạn tự chỉ định chương trình nào đó mà bạn muốn installer gọi khi install hay uninstall
Launch condition s Editor: editor này cho phép bạn kiểm tra các yêu cầu tối thiểu cho ứng dụng của bạn install trên máy client
Mục tiếp theo , bạn sẽ tìm hiểu sâu hơn về tất cả editor trên
1.1 File System Editor
Nhìn cái tên là bạn biết editor này có chức năng gì , editor này cho phép bạn add vào Project Output những file như assemply , các file output vào thư mục xác định nào đó , bạn có thể xác định vị trí nơi các file này sẽ được install tới máy client File System Editor mở bằng cách sau :
- Click phải Project trong Solution Explorer , và chọn View à File System để hiện thị File System Tại đây bạn có thể chỉ định các file cài đặt (H13)
- Trên cửa sổ File System (mặc định đang được mở, nếu chưa có thể mở ra bằng cách nhấn phải chuột trên project cài đặt -> View -> File System)
File System Editor cung cấp một số folder đặc biệt được định nghĩa trước , mà bạn có thể add vào gói cài đặt của bạn Môt số folder quan trọng trong File System Editor là:
Application Folder: Application Folder đại diện cho thư mục sau :
[ProgramFilesFolder][Manufacturer][ProductName] Thư mục Manufacturer và ProductName sẽ được chỉ định bằng cửa sổ Properties
Global Assembly Cache Folder: Thư mục này cho phép bạn thêm các assembly được install dưới dạng shared assemblies trên máy client
User’s Desktop: chỉ định các files sẽ xuất hiện trên Desktop người dùng Vị trị mặc định thường là folder [DriveName]Documents and Settings[UserName]Desktop, với UserName đại diện cho tên tài khoản của người dùng trên máy client
User’s Program Menu: đường dẫn mặc định thường là [DriveName]Documents and
Settings[UserName]Start MenuPrograms, với UserName đại diện cho tên tài khoản của người dùng trên máy client
VD :
- Tạo thêm thư mục Bin, Database (giả sửa có dùng file CSDL Access) bằng cách nhấn phải chuột trên biểu tượng Application Folder -> Add -> Folder (xem H13)
Trang 15Hình 13: Add thư mục
- Kéo thả biểu tượng Primary output … trong thư mục Application Folder vào thư mục Bin vừa tạo Tức
là ta muốn các file EXE và file DLL(H14)
Trang 16Hình 15 : Insert file database
Lưu ý : Ban đầu , File System Designer chỉ hiện thị một số thư mục thường được sử dụng Bạn có thể liên kết thêm các thư mục bằng cách nhấp phải vào vùng trống và chọn Add Special Folder Có các tùy chọn ánh xạ đến thư mục Font , Favorites , Starup … của máy tính , cho phép bạn cài đặt các file và các shortcut ở các vị trí khác nhau
Lưu ý : Khi các bạn sắp xếp các file ở các thư mục khác nhau , sẽ ảnh hưởng tới đường dẫn tương đối của các file liên quan đến nhau VD như file CSDL , do đó bạn phải đảm bảo source code của bạn thay đổi phù hợp đường dẫn đó
1.1.1 Tạo shorcut
- Tạo shortcut cho chương trình: nhấn phải chuột trên biểu tượng Primary output … -> Create Shortcut
to Primary output From … một shortcut được tạo ra trong cùng thư mục à đặt lại tên nếu muốn à kéo biểu tượng này vào User’s Desktop, nếu muốn trên Desktop sẽ có shortcut của chương trình, thực hiện tương tự cho shortcut trong User’s Programs Menu (không dùng cho Web Application)
Hình 16
1.1.2 Add Assembly vào GAC
- Giả sử bạn muốn add thêm 1 assembly độc lập được dùng bởi ứng dụng của bạn vào thư mục Global Assembly Cache Để làm điều này , bạn mở File System Editor bằng cách chọn menu View ->Editor ->File System Editor Sau đó , click chuột phải vào folder File System và chọn Add Special Folder -> Global Assembly Cache Folder Khi đó sẽ xuất hiện thư mục con của File System Bây giờ bạn có thể add assembly của bạn vào Global Assembly Cache folder Bằng cách click phải Global Assembly Cache folder
và chọn Add -> Assembly Trong hộp thoại Component Selector , chọn assembly mà bạn muốn add vào Sau khi add xong thì lúc install nó sẽ copy assembly đó vào folder Global Assembly Cache ở máy client
Trang 17Hình 17
1.2 Registry Editor
- Nhìn cái tên là bạn đã biết editor này làm gì , nó cho phép quản lý các giá trị các registry key của máy client Mặc định registry editor hiện thỉ các key chuẩn của Windows registry như sau :
HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, và HKEY_USERS
- Việc khi thêm hay thiết lập registry trong quá trình cài đặt là việc làm thường xuyên “ở huyện” , hầu như 1 ứng dụng nào đó đều ghi thêm “tí tẹo” nào đó để đánh dấu sự hiện diện của nó trong máy client , ngay cả các thành phần portable cũng không thoát khỏi ngoại lệ này
- Click chuột phải vào Setup Project à View à Registry Cửa sổ Registry On Target Machine hiện lên (H17)
Trang 18Hình 18
VD :
- Registry editor đại diện cho cấu trúc của registry editor ở máy client Vd , chúng ta add 1 key nằm trong trong HKEY_LOCAL_MACHINE Bằng cách click phải vào nhánh HKEY_LOCAL_MACHINE , chọn New Key , và key con tên là Software Cứ như thế bạn có thể add các key phân cấp giống như hình sau :
Trang 19Hình 19
- Sau đó bạn install phần mềm tại máy client thì cấu trúc phân nhánh key trong registry của máy client giống y chang trong lúc bạn cấu hình bằng Registry Editor như hình trên
- Các thông tin thường tạo là [Tên công ty] , [version] v.v…
1.3 File Types Editor
- Mục đích : bạn muốn ứng dụng của bạn tự động mở khi người dùng chọn kiểu file nào đó trong Windows Explorer
- Bạn có thể đăng ký các kiểu file bằng cách chỉnh sửa Registry bằng tay Tuy nhiên cách đó rất nguy hiểm dễ gây hỏng Windows nếu user không am hiểu rõ về registry Có một cách hay hơn là thực hiện các cấu hình này một lượt (lúc cài đặt) với các tính năng đi cùng với Setup Project
- 1 Click phải chuột vào Setup Project trong Solution Explorer và chọn View à File Types để hiện thị File Type Designer (H20)