2010-11-03 9 views
8
  1. Tôi có một dự án Ứng dụng Windows (A.exe) gọi một dự án khác Thư viện lớp học (B.dll).Thiết lập dự án không thay thế các tệp lắp ráp

  2. A.exe có nút (myButton) rằng gọi phương thức Method1 từ B.dll.

  3. Để cài đặt ứng dụng tôi đã tạo một dự án cài đặt ASetup.vdproj, mà Output tiểu học là dự án A.

  4. Sau khi biên dịch cài đặt, quá trình cài đặt chạy mà không có bất kỳ vấn đề , khi a.exe bắt đầu và tôi nhấp vào myButton, aplication cung cấp cho không có lỗi.

  5. Sau đó, tôi đã thay đổi B.dll và thêm phương thức mới Method2.

  6. myButton hiện đang gọi Method2 từ B.dll thay vì Method1.

  7. Tôi đã tăng phiên bản A.exe và tăng phiên bản ASetup.vdproj, nhưng không tăng phiên bản B.dll.

  8. Sau khi cài đặt ứng dụng, tôi nhận thấy tôi có hai cài đặt A.exe trong Pa-nen điều khiển -> Thêm/ Xóa chương trình.

  9. Khi chạy a.exe và nhấp myButton tôi có được một lỗi: " phương pháp Method2 không được tìm thấy trong B.dll", nó có nghĩa là các thiết lập không không thay thế B.dll trong cài đặt.

  10. Tôi đã gỡ cài đặt và tôi nhận thấy rằng các tệp không bị xóa khỏi đĩa.

Câu hỏi của tôi là:

Tại sao cập nhật không quá trình cài đặt thứ hai B.dll? Nếu phiên bản B.dll được tăng lên, B.dll sẽ được thay thế trong khi cài đặt, nhưng vấn đề là dự án hiện tại của tôi có nhiều assembly bên ngoài, rất khó kiểm soát nếu chúng đã được sửa đổi hay không. Về cơ bản, những gì tôi muốn là tất cả các tập tin lắp ráp được thay thế trong mỗi lần cài đặt.

Tôi đang chờ phản hồi từ tất cả các bạn. Cảm ơn tất cả mọi người đã chú ý.

Trả lời

6

2 mục trong chương trình Thêm/loại bỏ cho tôi biết rằng bạn đã thay đổi thuộc tính ProductCode nhưng không có hàng hợp lệ trong Bảng nâng cấp để xác định chính xác Nâng cấp chính. MSI coi đây là 2 sản phẩm khác nhau xảy ra để cài đặt vào cùng một thư mục. Khi bạn gỡ cài đặt một trong hai sản phẩm, các tệp vẫn còn cho đến khi bạn gỡ cài đặt sản phẩm khác.

DLL không bị ghi đè đề xuất với tôi rằng bạn không thay đổi thuộc tính AssemblyFileVersion từ một phiên bản này sang bản dựng khác. Bản cài đặt đầu tiên trong phiên bản 1.0.0.0 và bản cài đặt thứ hai cho biết "1.0.0.0 đã có, không có gì để làm ở đây" và bỏ qua nó.

2

Bên cạnh vấn đề được đề cập bởi @Christopher Painter, có nhiều khả năng vấn đề khác: Dự án thiết lập được tạo bằng Visual Studio (2008) sẽ chỉ thay thế tệp nếu số phiên bản đã được tăng lên. Giải pháp hiển nhiên sẽ là tăng tất cả các số phiên bản; tuy nhiên, điều này có thể không phải lúc nào cũng là điều bạn muốn.

Hành vi của tệp .msi về cơ bản được xác định bởi thời điểm hành động RemoveExistingProducts được thực thi. Người cài đặt được tạo với VS 2008 lập lịch hành động này sau sản phẩm mới đã được cài đặt. Các hội đồng đã được sửa đổi có phiên bản chưa được tăng lên do đó không được thay thế. Một số chi tiết về hành vi update được mô tả trong luồng này:

RemovePreviousVersions=True but previous version is not removed from the target machine

Để thay đổi hành vi, bạn có thể vá các tập tin .msi tạo để các hành động được thực hiện RemoveExistingProductstrước sự sản phẩm mới được cài đặt (điều này thực sự là hành vi nếu bạn tạo thiết lập với Visual Studio 2005). Bản vá có thể, ví dụ: được thực hiện bằng cách sử dụng một VBScript nhỏ chạy dưới dạng bước được xây dựng sau:

Dim objInstaller 
Dim objDatabase 
Dim objView 
Dim objResult 

Dim strPathMsi 

If WScript.Arguments.Count <> 1 Then 
    WScript.Echo "Usage: cscript fixRemovePreviousVersions.vbs <path to MSI>" 
    WScript.Quit -1 
End If 

strPathMsi = WScript.Arguments(0) 

Set objInstaller = CreateObject("WindowsInstaller.Installer") 
Set objDatabase = objInstaller.OpenDatabase(strPathMsi, 1) 
Set objView = objDatabase.OpenView("UPDATE InstallExecuteSequence SET Sequence=1450 WHERE Action='RemoveExistingProducts'") 

WScript.Echo "Patching install sequence: UPDATE InstallExecuteSequence SET Sequence=1450 WHERE Action='RemoveExistingProducts'" 
objView.Execute 
objDatabase.Commit 

WScript.Quit 0 
+1

Tôi đã sử dụng VDPROJ đó và không mất nhiều thời gian để thực hiện VDPROJ hút. Dump VDPROJ bây giờ cho một công cụ khác (WiX hoặc IS 2010 LE) và bạn sẽ có một cuộc sống lâu hơn. :-) BTW, CM Expert trong tôi nói rằng thật điên rồ khi cố ý gửi 2 MSI với các assembly khác nhau có cùng phiên bản file. Truy xuất nguồn gốc là rất quan trọng. –

+0

@Christopher Painter: Tất cả đều rất đúng. –

+0

Ý nghĩa của lệnh "SET Sequence = 1450" này là gì? Có cách nào để nhìn vào "cơ sở dữ liệu" mà tôi giả định được nhúng vào MSI ở đâu đó? – Qwertie