2010-03-16 44 views
17

Do sự nhầm lẫn của người dùng, ứng dụng của chúng tôi yêu cầu trình cài đặt riêng cho các phiên bản Windows 32 bit và 64 bit. Trong khi trình cài đặt 32 bit chạy tốt trên win64, nó có khả năng tạo ra nhức đầu hỗ trợ và chúng tôi muốn ngăn điều này xảy ra.WiX: Ngăn trình cài đặt 32 bit chạy trên Windows 64 bit

Tôi muốn ngăn trình cài đặt MSI 32 bit chạy trên các máy Windows 64 bit. Để kết thúc mà tôi có điều kiện sau đây:

<Condition Message="You are attempting to run the 32-bit installer on a 64-bit version of Windows."> 
    <![CDATA[Msix64 AND (NOT Win64)]]> 
</Condition> 

Với Win64 định nghĩa như thế này:

<?if $(var.Platform) = "x64"?> 
<?define PlatformString = "64-bit"?> 
<?define Win64 ?> 
<?else?> 
<?define PlatformString = "32-bit"?> 
<?endif?> 

Thing là, tôi không thể có được việc kiểm tra này để làm việc ngay. Hoặc là nó cháy tất cả các thời gian, hoặc không có thời gian. Mục đích là để kiểm tra sự hiện diện của biến thời gian chạy msix64 so với biến biên dịch Win64 biên dịch và ném một lỗi nếu chúng không xếp hàng, nhưng logic không hoạt động như thế nào tôi dự định nó. Có ai đưa ra giải pháp tốt hơn không?

Trả lời

15

Chỉ bao gồm phần tử Condition trong gói 32 bit của bạn (tức là, sử dụng? Nếu? báo cáo tiền xử lý). Điều kiện sẽ là "NOT Msix64": Điều kiện khởi chạy là những thứ phải đúng, vì vậy nếu Msix64 được đặt, điều kiện khởi chạy sẽ không thành công và điều đó có nghĩa là hệ điều hành x64 và gói 32 bit và điều chính xác cần làm là khối.

+0

Điều này đã kết thúc. Sai lầm của tôi là nhận lại logic cho 'Điều kiện'. –

+1

Msix64 yêu cầu Windows Installer 3.1 không có trên XP theo mặc định (xem http://msdn.microsoft.com/en-us/library/aa370522(v=VS.85).aspx) –

3

Yếu tố điều kiện hoạt động với các thuộc tính của trình cài đặt windows, có trong quá trình cài đặt.

Tuy nhiên, bạn đang xác định Win64 làm biến wix, không phải thuộc tính trình cài đặt windows. Biến Wix chỉ tồn tại trong khi thiết lập được tạo. Bạn phải tham chiếu chúng dưới dạng $(var.MyWixVariable) nơi bạn sử dụng chúng và trình xử lý tiền xử lý sau đó sẽ thay thế chúng bằng giá trị đã xác định của chúng.

tôi sẽ cố gắng này để thay thế:

<?if $(var.Platform) = "x64"?> 
<?define PlatformString = "64-bit"?> 
<Property Id="Win64" Value="1" /> 
<?else?> 
<?define PlatformString = "32-bit"?> 
<?endif?> 

Nếu $(var.Platform) có giá trị ngay khi thiết lập được tạo ra, thì điều này sẽ gây ra một "Win64" tài sản để được ghi vào cơ sở dữ liệu cửa sổ cài đặt (ví dụ MSI tệp) và thuộc tính sẽ có sẵn trong khi cài đặt để sử dụng trong phần tử điều kiện.

+0

này ném một lỗi khi chạy qua ánh sáng trên Wix 3.6 chỉ ra rằng các yếu tố tài sản lồng nhau không thể được đặt với cú pháp . – Jon

+0

@JonSamwell: Các hướng dẫn xử lý này ('') được dành cho bộ tiền xử lý trong candle.exe. Light.exe sẽ không bao giờ nhìn thấy chúng nếu bạn đang sử dụng chính xác wix. –

3

Thêm điều kiện này

<Condition Message="This is designed for 32bit OS">%PROCESSOR_ARCHITECTURE ~= "x86" AND %PROCESSOR_ARCHITEW6432 &lt;&gt; "amd64"></Condition> 

Bạn có thể tạo một trình cài đặt với một thành phần 32bit và một thành phần 64bit và đặt hai điều kiện này trong các thành phần tương ứng

<Component Id="bit32Component" Guid="..." Feature="ProductFeature"> 
    <Condition>%PROCESSOR_ARCHITECTURE~="x86" AND %PROCESSOR_ARCHITEW6432&lt;&gt;"amd64"></Condition> 
</Component> 
<Component Id="bit64Component" Guid="..." Feature="ProductFeature"> 
    <Condition>%PROCESSOR_ARCHITECTURE~="amd64" OR %PROCESSOR_ARCHITEW6432~="amd64"></Condition> 
</Component> 

đây là một tài liệu tham khảo tôi đã sử dụng

http://blogs.msdn.com/david.wang/archive/2006/03/26/HOWTO-Detect-Process-Bitness.aspx

6

Chúng tôi sử dụng những điều sau đây ...

<?if $(var.ProcessorArchitecture)=x86 ?> 
<Condition Message="!(loc.LaunchCondition_Error64)"> 
    <![CDATA[Installed OR Not VersionNT64]]> 
</Condition> 
<?endif?> 
+1

VersionNT64 yêu cầu Windows Installer 4.0 (xem http://msdn.microsoft.com/en-us/library/windows/desktop/aa372497.aspx) –

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