6

Tôi có dịch vụ Windows được viết bằng C# bằng cách sử dụng VS2005.Làm thế nào để thuyết phục một MS200 VS2005 để nâng cấp?

Cài đặt qua trình hướng dẫn gọi msiexec để cài đặt tệp msi cũng được tạo bằng cách sử dụng VS2005.

Tôi gặp sự cố khi tạo tệp msi sẽ nâng cấp từ một phiên bản dịch vụ này sang phiên bản dịch vụ khác. Chương trình hướng dẫn xử lý việc phát hiện phiên bản hiện đang được cài đặt, dừng dịch vụ, đưa ra một dòng lệnh thích hợp cho msiexec và sau đó khởi động lại dịch vụ.

msi hiện tại có thuộc tính phiên bản là 1.1.02, phiên bản mới là 1.1.03. Mã sản phẩm và mã nâng cấp giống hệt nhau.

Gỡ cài đặt 1.1.02 theo cách thủ công thông qua các chương trình thêm/xóa hoạt động tốt, cũng như cài đặt 1.1.03 vào hệ thống "sạch".

Nâng cấp 1.1.02 đến 1.1.03 đi qua các chuyển động nhưng kết quả cuối cùng là 1.1.02 được cài đặt.

Các dòng lệnh mà trình hướng dẫn sử dụng cho nâng cấp là:

msiexec/qb/i "MyProduct.msi" cài đặt lại = "TẤT CẢ" REINSTALLMODE = "vos"

tôi đi đâu vậy? Tôi giả định rằng tôi phải bỏ lỡ điều gì đó khá cơ bản ...

Vị trí dự phòng là thông báo cho khách hàng rằng họ cần gỡ cài đặt thủ công 1.1.02 trước khi chạy trình hướng dẫn cài đặt 1.1.03 nhưng tôi muốn không phải làm vậy.

Edited thêm:

Thay đổi mã sản phẩm (như VS2005 cũng nhắc bạn) thực sự loại bỏ khả năng nâng cấp ở tất cả, vì nó trình cài đặt sẽ không cho phép bạn làm một cài đặt lại nếu đó là mã sản phẩm hasn trước đó chưa được cài đặt.

Sau đó, tất cả điều đó sẽ cho phép bạn thực hiện là cài đặt (và sau đó bạn nhận được thông báo kiểu "dịch vụ đã tồn tại" thông thường).

Trả lời

8

Có một số điều cần được thực hiện để có được "nâng cấp" để hoạt động với MSI nếu bạn muốn tự động xóa phiên bản trước đó.

Đầu tiên một số thông tin cơ bản về "mã" bí ẩn. Có 3 mã (GUID của) kết hợp với một MSI:

  1. Gói Mã - này xác định một phiên bản đặc biệt của trình cài đặt MSI và không bao giờ nên được tái sử dụng trên toàn xây dựng. Nó phải luôn luôn được cập nhật.
  2. Mã sản phẩm - Số nhận dạng này được sử dụng để ID một phiên bản ứng dụng cụ thể. Tùy thuộc vào tác giả cài đặt để quyết định thời điểm chỉ định mã sản phẩm mới.
  3. Upgrade Mã - này xác định việc áp dụng và không nên thay đổi thông qua đó là đời

Các Mã Upgrade không bao giờ nên thay đổi. Đối với bạn nâng cấp scenerio, Mã sản phẩm phải được thay đổi cho mỗi phiên bản. Ngoài ra, như bạn đã đề cập, bạn phải tăng số phiên bản.Mã sản phẩm Mã sản phẩmMã nâng cấp có thể được tìm thấy bằng cách chọn dự án thiết lập của bạn và chuyển đến Cửa sổ thuộc tính. Mã gói bị ẩn trong Studio và sẽ luôn được cập nhật.

Mục bạn có thể bị thiếu, là bạn cũng cần đặt cài đặt RemovePreviousVersions trong Cửa sổ thuộc tính thành đúng.

6

Một điều nữa, thêm vào mohlsen của câu trả lời (Đối với Visual Studio 2008):

Để Output Chính (! EXE của bạn) để nâng cấp đúng cách, bạn phải tăng các FILE VERSION

Thiết lập này có thể được tìm thấy trong Thuộc tính dự án: Tab ứng dụng -> Thông tin hội

+0

Đúng - đã thiết lập ok. Cuối cùng đã từ bỏ điều này và sử dụng để làm cho trình hướng dẫn thực hiện việc gỡ cài đặt, sau đó là cài đặt mới nếu phát hiện phiên bản cũ hơn tại chỗ. Dường như làm việc ok và cho phép người dùng cuối nâng cấp mà không cần phải tự fiddle với bất cứ điều gì. –

+0

Ngoài ra, theo như tôi có thể tạo ra, các MSIs được xây dựng bởi Visual Studio rõ ràng khét tiếng vì không cho phép bạn nâng cấp các dịch vụ, vì vậy bằng cách thực hiện công việc trong trình hướng dẫn tôi dường như tránh rơi vào bẫy tiếp theo. –

+0

+1 nhưng để làm cho nó hoàn toàn rõ ràng, điều này đang nói nâng cấp phiên bản tệp của dự án CHÍNH (không phải dự án thiết lập!). –

2

Cách dễ dàng hơn để quản lý việc này là loại bỏ AssemblyFileVersion khỏi tất cả các assembly, bao gồm cả tệp thực thi chính và tất cả các DLL được quản lý.

Trong mỗi tệp AssemblyInfo.cs của bạn, tôi khuyên bạn nên làm một cái gì đó như thế này nếu bạn không quan tâm đến số phiên bản, nhưng muốn có một số truy xuất nguồn gốc.

[assembly: AssemblyVersion("1.1.*")] 
// don't need this [assembly: AssemblyFileVersion("1.0.0.0")] 

Tất cả mọi thứ vẫn biên dịch tốt, và nếu bạn không có các AssemblyFileVersion xác định, sau đó trình cài đặt giả định rằng mọi thứ đều khác nhau mỗi lần (mà có lẽ là tốt nếu bạn đang cài đặt tất cả các DLL bên cạnh chính EXE).

Tôi đã dành nhiều thời gian để tìm hiểu điều này, đặc biệt nếu tôi không muốn phải tăng thêm bất kỳ thứ gì theo cách thủ công!

Các vấn đề liên quan