2009-03-31 42 views
5

Tôi có một tệp được chia sẻ, chúng tôi sẽ gọi nó là Utility.dll được cài đặt bởi nhiều sản phẩm. Trong tệp WIX của tôi, tôi cài đặt Utility.dll như một thành phần riêng biệt. Bây giờ phiên bản 2.0 của tài liệu tham khảo Utility.dll thêm một dll, UtilityUtility.dll mà sẽ cần phải được cài đặt cùng với.WIX thêm tệp mới vào thành phần được chia sẻ

Lần đầu tiên tích hợp UtilityUtility.dll, tôi đã tạo thành phần WIX mới chứa dll mới.

này gây ra vấn đề trong các tình huống sau

1) tài cài đặt sản phẩm 1 {Utility.dll 1,0}
2) tài cài đặt sản phẩm 2 {Utility.dll 2.0, UtilityUtility.dll 2,0}
3) người dùng gỡ bỏ sản phẩm 2 {Utility.dll 2,0}

Bây giờ khi người dùng sử dụng Utility.dll nó sẽ thất bại khi nó không thể tìm ra tham chiếu UtilityUtility.dll

Điều này dẫn tôi để thêm UtilityUtility.dll để thành phần gốc ngăn cản Ut ilityUtility.dll bị loại bỏ trong kịch bản trước nhưng đi kèm với vấn đề riêng của nó.

1) tài cài đặt sản phẩm 1 {Utility.dll 1,0}
2) tài cài đặt sản phẩm 2 {Utility.dll 2.0, UtilityUtility.dll 2,0}
3) tài tháo gỡ sản phẩm 2 {Utility.dll 2.0, UtilityUtility .dll 2.0}
4) Gỡ cài đặt người dùng Sản phẩm 1 {UtilityUtility.dll 2.0}

UtilityUtility.dll bị mồ côi vì nó không bị xóa bỏ khi gỡ cài đặt Product 1 (nó không tồn tại trong thành phần khi nó ban đầu Cài đặt).

Tôi có tùy chọn nào khác ở đây không?

Cảm ơn

Trả lời

3

Trừ khi bạn có thể cập nhật Sản phẩm 1 (mà tôi đoán là không hoàn toàn có thể), tôi nghĩ rằng bạn đang hơi say. IMHO, Quy tắc thành phần là điều tồi tệ nhất về trình cài đặt Windows. Điều này link to an old blog post of mine tổng kết phần lớn của nó. Trường hợp của bạn hơi khác so với những gì được mô tả ở đó nhưng kết quả được mong đợi.

Tôi nghĩ bạn nên chọn ít hơn hai tệ nạn.

+0

Với kịch bản đầu tiên sẽ cài đặt lại/sửa chữa Product1 sau khi Unistall của Product2 sử dụng REINSTALLMODE = a (hoặc amus) sửa chữa tình huống? Tôi có một dự án thử nghiệm tương tự và có vẻ như sửa chữa thay thế v2 DLL với v1 –

+0

Có, sửa chữa Product1 bằng REINSTALLMODE = a sẽ buộc tất cả các tệp trong gói đó trên máy, có khả năng vi phạm bất kỳ tệp được chia sẻ nào khác. "a" là một cái búa rất tàn bạo để xoay. –

+3

Bài đăng Rob đề cập đến về Quy tắc thành phần, tôi tin rằng, được chuyển đến http://robmensching.com/blog/posts/2003/10/18/Component-Rules-101 – adamjcooper

0

Bạn có thể tạo lại vấn đề thứ hai không? Về lý thuyết sau khi bạn cài đặt phiên bản thành phần Sản phẩm 2 trở thành 2.0. Sau khi bước 3 thành phần phiên bản vẫn là 2,0. Khi người dùng gỡ cài đặt sản phẩm 1 trong bước 4, Windows Installer biết cách loại bỏ cả Utility.dll 2.0 và UtilityUtility.dll 2.0.

Cập nhật: Tôi đã sai, xin lỗi.

+0

@Pavel không có thứ như "phiên bản thành phần" trong Trình cài đặt Windows. Hành vi được mô tả ở trên là những gì tôi mong đợi. –

+0

Tôi có một repro. – user38309

1

Tôi không chắc chắn 100% ... nhưng tôi nghĩ rằng việc thêm thứ hai .DLL vào thành phần ban đầu có thể là "vi phạm" của các quy tắc thành phần. Hãy xem: http://blogs.msdn.com/robmen/archive/2003/10/18/56497.aspx

Từ những gì tôi thu thập từ đám đông Wix, "thực hành tốt nhất" hàng đầu là có từng tệp như một thành phần riêng lẻ.

Kế hoạch nâng cấp của bạn (theo thuật ngữ msi: major, minor, patch) là gì? Nếu tôi nhớ lại một cách chính xác, các nâng cấp nhỏ không được phép muck với các định nghĩa thành phần. Không có ý tưởng về các bản vá lỗi.

Bạn cũng có thể muốn lo lắng về việc sửa chữa.

+0

Tôi rất muốn có dll thứ hai trong thành phần riêng của nó nhưng tôi cần phải ngăn chặn nó bị loại bỏ trong bước kịch bản đầu tiên 3. Tôi có kế hoạch thực hiện các nâng cấp lớn. – user38309

+0

@summergoat: Tôi nghĩ bạn có thể không may mắn (xem Rob Menshing bình luận). Bạn có thể muốn hỏi về danh sách gửi thư wix ... họ có xu hướng hữu ích và hiểu biết sâu sắc về trình cài đặt cửa sổ (điều này không thực sự là một câu hỏi wix ... nhưng một câu hỏi cài đặt cửa sổ). – user53794

0

Tôi đã tự mình gặp vấn đề này. Tôi đồng ý với @rbobby và tôi tiếp tục gửi rằng thực tế rằng bạn có thể hình dung tình huống người dùng bị hỏng này là bằng chứng cho thấy bạn đang vi phạm các quy tắc. Bạn chỉ nên cập nhật một thành phần được chia sẻ nếu nó hoàn toàn và hoàn toàn tương thích. Nếu Duck 2.0 không quack hoặc bơi, hãy tạo một tên mới cho nó.

Trong trường hợp của bạn, bạn có Utility.dll 1.0 và Utility.dll 2.0, nhưng chúng chỉ là "cùng một thành phần" trong đó chúng làm những việc tương tự theo một cách khác. Utility.dll 2.0 thực sự nên được gọi là UtilityPlus.dll 1.0.

Xin lỗi, tôi biết đó có thể không phải là câu trả lời bạn muốn nghe, nhưng trường hợp kỹ thuật là rõ ràng.

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