2016-01-15 36 views
6

Tôi có đơn đăng ký được biên soạn trong VS 2015 và yêu cầu gói VC++ Redistributable để chạy đúng cách. Trước phiên bản mới nhất này, chúng tôi đã sử dụng phiên bản cũ hơn của VS và chỉ đơn giản sử dụng mô-đun hợp nhất để xử lý việc cài đặt các tệp redist thích hợp. Tuy nhiên, tôi nhận thấy rằng khi sử dụng phiên bản mới nhất của các mô-đun hợp nhất cho năm 2015 (Microsoft_VC140_CRT_x64.msm) mà ứng dụng của tôi vẫn không hoạt động. I did some digging và có vẻ như một số thứ đã thay đổi với phiên bản mới nhất của mô đun hợp nhất. Có vẻ như Microsoft hiện đang đề xuất cài đặt gói vcredist_x64.exe trực tiếp thay vì sử dụng các mô-đun hợp nhất.WIX chạy vcredist_x64.exe khi cài đặt

Vì vậy, tôi đang cố tạo hành động tùy chỉnh để thực hiện việc này. Tôi đang theo dõi similar tutorial here, mặc dù điều chỉnh nó cho VC Redistributable thực thi. Điều đầu tiên tôi cần làm là thiết lập nơi tệp .exe sẽ được đặt sau khi được cài đặt:

Sau đó, tôi cần phải thêm tệp của mình vào nhóm thành phần sẽ được cài đặt như một phần của ẩn tính năng (vì tôi muốn cài đặt này tự động).

<ComponentGroup Id="VCRedist" Directory="VCREDISTDIR"> 
    <Component Id="vcredist_x64.exe" Guid="-INSERT-GUID-HERE-" Win64="yes"> 
    <File Id="VCREDISEXE" Name="vcredist_x64.exe" KeyPath="yes" Source="$(var.VCRedistSourceDir)" Checksum="yes"></File> 
    </Component> 
</ComponentGroup> 

Và ...

<Feature Id="VCRedistributable" Title="Visual C++ Runtime" AllowAdvertise="no" Display="hidden" Level="1"> 
    <ComponentGroupRef Id="VCRedist" /> 
</Feature> 

Tại thời điểm này, các vcredist_x64.exe nên được sao chép vào máy tính của người dùng cuối. Bây giờ, tôi cần tạo một hành động tùy chỉnh để khởi động tệp thực thi sau khi cài đặt.

<CustomAction Id="InstallVCRedistributable" 
      FileKey="VCREDISEXE" 
      Execute="deferred" 
      ExeCommand="/silent" 
      Impersonate="no" 
      Return="check"/> 

<InstallExecuteSequence> 
    <Custom Action="InstallVCRedistributable" Before="InstallFinalize"> 
    <![CDATA[NOT REMOVE]]> 
    </Custom> 
</InstallExecuteSequence> 

Tôi cũng bao gồm thông báo trạng thái cho giao diện người dùng của mình để tôi có thể xem thời điểm thực thi được thực hiện.

<UI> 
    <ProgressText Action="InstallVCRedistributable">Installing Visual C++ Redistributable for Visual Studio 2015</ProgressText> 
</UI> 

Bây giờ, khi tôi chạy trình cài đặt, nó sẽ khởi chạy vcredist_x64.exe ... và sau đó trong khi cài đặt tệp thực thi nó bị treo lên. Tôi nhận được thông báo bật lên cho biết có sự cố với Gói cài đặt Windows này và chương trình chạy như một phần của quá trình thiết lập không hoàn thành. Sau đó nó quay trở lại cài đặt ứng dụng chính của tôi và không bao giờ được cài đặt. Bất cứ ai có thể giải thích lý do tại sao điều này đang xảy ra và làm thế nào để sửa chữa nó? Cảm ơn!

+0

FYI, thêm Microsoft_VC140_CRT_x64.msm trong trình cài đặt của bạn * sẽ * hoạt động miễn là hệ thống đích cũng có cài đặt Universal CRT. Bản thân mô-đun hợp nhất không còn hoàn toàn tự phụ thuộc nữa. –

Trả lời

3

Tôi nghĩ rằng cách tiếp cận chính xác cần thực hiện khi có các điều kiện tiên quyết có trình cài đặt riêng của họ là tạo gói khởi động WiX, chạy qua từng trình cài đặt lần lượt. Điều này xử lý những thứ như rollbacks về lỗi cài đặt, vv, mà chạy các hành động tùy chỉnh từ bên trong một trình cài đặt thì không.

Có thể xem mẫu barebones here, bạn thêm <MsiPackage><ExePackage> vào phần tử Chain theo thứ tự bạn cần chúng cài đặt.

+0

Tôi đã hy vọng tôi có thể lấy đi mà không cần sử dụng bootstrapper. Nhưng, nó có thể là không thể. Lý do chính là tôi đã có một tệp .msi tùy chỉnh hiển thị EULA của tôi trong các nền văn hóa khác nhau một cách tự động. Tôi không chắc chắn nếu nó có thể bỏ qua các tập tin giấy phép với các ứng dụng bootstrap và chỉ cần sử dụng nó để cài đặt .msi và sau đó vcredist_x64.exe trong một đi. Nhưng, tôi đoán tôi cần phải đào sâu hơn. Nếu bạn có bất kỳ cách nào khác, có thể là cách 'thanh lịch' hoặc 'thân thiện với người msi' hơn để thực hiện việc này, vui lòng cho tôi biết. – andyopayne

+0

Ngoài ra, không ai biết tại sao việc triển khai hiện tại của tôi, sử dụng hành động tùy chỉnh để khởi chạy tệp .exe bị lỗi? Có vẻ như nó sẽ hoạt động. Có phải vì vcredist_x64.exe có một hộp kiểm tra cài đặt mà yêu cầu bạn đồng ý với các điều khoản và điều kiện của họ. Điều này có thể khiến trình cài đặt của tôi thất bại không? – andyopayne

+0

Bạn có thể có bootstrapper hiển thị giao diện cài đặt MSI của bạn khi bạn chạy nó, và tôi nghĩ rằng bạn có thể thiết lập bootstrapper không có ui. –

5

Tôi đã tìm thấy câu hỏi này và tự mình thử nghiệm, trong cùng một tình huống. Tôi thấy lỗi trình cài đặt mà bạn đang gặp phải là/là Lỗi 1618: "Cài đặt khác đã được tiến hành". Dường như việc chạy trình cài đặt vc_redist bên trong trình cài đặt của riêng bạn sẽ không hoạt động.

Các tùy chọn khác của bạn dường như đang tạo bootstrapper như Patrick Allwood đề xuất ở trên hoặc đơn giản yêu cầu người dùng tự cài đặt gói vc_redist trước khi chạy trình cài đặt của riêng bạn.Bạn có thể phát hiện nếu Universal C Runtime đã có mặt bằng cách kiểm tra ucrtbase.dll trong C:\Windows\System32:

<Property Id="UCRTINSTALLED"> 
    <DirectorySearch Id="UCRTSystemSearch" Path="[WindowsFolder]System32" Depth="0"> 
    <FileSearch Id="UCRTFileSearch" Name="ucrtbase.dll" MinVersion="10.0.10240.16389" /> 
    </DirectorySearch> 
</Property> 

Nếu bạn chỉ có một trình cài đặt 32-bit, bạn cũng có thể sử dụng [SystemFolder] sở hữu trực tiếp.

EDIT: Như Kevin Smyth đã đề cập, phiên bản ucrtbase.dll đang đưa ra các vấn đề lạ - báo cáo phiên bản 2.X tới một số công cụ và phiên bản 10.Y cho các công cụ khác. Bạn có thể xóa thuộc tính MinVersion nếu bạn chỉ muốn kiểm tra sự tồn tại của ucrtbase.dll.

+0

Tôi không thể làm cho nó hoạt động với MinVersion ?! (Tôi có "10.0.10586.0" trên ucrtbase.dll của tôi) Bất kỳ ý tưởng? – Macke

+1

Kiểm tra MinVersion này không thành công! 'win32api.GetFileVersionInfo ('ucrtbase.dll', '\\')' trả về '2.6.10586.0' cho phiên bản tệp trên máy tính Windows 10 của tôi. 'sigcheck.exe' trả về' 10.0.10586.0'. Rất kỳ quặc. Tệ hơn nữa, 'msiexec/i/log * xv' không ghi lại bất cứ điều gì hữu ích. Tôi đã xóa 'MinVersion' và nó hoạt động. –

+0

FYI: việc tìm ucrtbase.dll sẽ xác nhận rằng "Universal CRT" được cài đặt. UCRT là một yêu cầu * cho các phân phối lại MSVC 2015, và vc_redist.exe sẽ khiến chúng được cài đặt nếu chúng bị bỏ sót. Tuy nhiên UCRT được cung cấp thông qua Windows Update, và do đó, hoàn toàn có thể cho ucrtbase.dll được cài đặt mà không cần cài đặt lại MSVC 2015. tl; dr: Không sử dụng sự tồn tại của ucrtbase.dll để quyết định có khởi chạy vc_redist.exe hay không. –

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