Thuộc tính được đặt như thế nào trên CustomActionData để được truy xuất bằng hành động tùy chỉnh bị trì hoãn?Làm thế nào để vượt qua CustomActionData đến một CustomAction bằng cách sử dụng WiX?
Trả lời
Hành động tùy chỉnh hoãn lại không thể truy cập trực tiếp vào thuộc tính trình cài đặt (reference). Trong thực tế, chỉ CustomActionData
tài sản
session.CustomActionData
và các phương pháp và các tài sản khác được liệt kê here có sẵn trên đối tượng session. Do đó, đối với hành động tùy chỉnh hoãn lại để truy xuất thuộc tính như INSTALLLOCATION
, bạn phải sử dụng hành động tùy chỉnh loại 51 - tức là hành động tùy chỉnh thuộc tính set - để chuyển thông tin đó và bạn sẽ tiêu thụ dữ liệu từ mã C# của CustomAction qua session.CustomActionData
. (Xem reference & reference)
Dưới đây là một ví dụ về một hành động tùy chỉnh kiểu 51 (CustomAction1
) sẽ thiết lập một tài sản có thể được lấy ra trong CustomAction2
.
<CustomAction Id="CustomAction1"
Property="CustomAction2"
Value="SomeCustomActionDataKey=[INSTALLLOCATION]"
/>
Lưu ý rằng Property
tên thuộc tính là CustomAction2
. Cái này quan trọng. Giá trị thuộc tính của thuộc tính của hành động loại 51 phải bằng/giống với tên của hành động tùy chỉnh đang tiêu thụ CustomActionData
. (xem reference)
Lưu ý tên SomeCustomActionDataKey
trong cặp Value
thuộc tính/cặp giá trị? Trong mã # C của bạn trong hành động tùy chỉnh tiêu thụ (CustomAction2
), bạn sẽ nhìn lên tài sản đó từ CustomActionData
bằng cách sử dụng biểu thức sau đây:
string somedata = session.CustomActionData["SomeCustomActionDataKey"];
Chìa khóa mà bạn sử dụng để lấy các giá trị từ CustomActionData
là không giá trị trong thuộc tính Property
của hành động tùy chỉnh loại 51, nhưng khóa từ cặp key=value
trong thuộc tính Value
. (takeaway Chú ý:. CustomActionData
được phổ biến bằng cách thiết lập một tài sản trình cài đặt có tên giống như Id của hành động tùy chỉnh tiêu thụ, nhưng CustomActionData
phím KHÔNG tìm trình cài đặt thuộc tính) (xem reference)
Trong kịch bản của chúng tôi tiêu thụ hành động tùy chỉnh là một hành động tùy chỉnh thu nhập hoãn lại được xác định phần nào giống như dưới đây:
<Binary Id="SomeIdForYourBinary" SourceFile="SomePathToYourDll" />
<CustomAction Id="CustomAction2"
BinaryKey="SomeIdForYourBinary"
DllEntry="YourCustomActionMethodName"
Execute="deferred"
Return="check"
HideTarget="no"
/>
Cấu hình InstallExecuteSequence
Tất nhiên, tiêu thụ hành động tùy chỉnh (CustomAction2
) phải chạy sau hành động tùy chỉnh loại 51 (CustomAction1
). Vì vậy, bạn sẽ phải sắp xếp chúng như thế này:
<InstallExecuteSequence>
<!--Schedule the execution of the custom actions in the install sequence.-->
<Custom Action="CustomAction1" Before="CustomAction2" />
<Custom Action="CustomAction2" After="[SomeInstallerAction]" />
</InstallExecuteSequence>
Đối với chúng tôi C++ schlubs, bạn lấy lại tài sản như sau:
MsiGetProperty(hInstall, "CustomActionData", buf, &buflen);
Sau đó, bạn phân tích 'buf'. Cảm ơn bạn Bondbhai.
Nếu giá trị truyền cho các hành động tùy chỉnh không phải là một bộ chìa khóa/cặp ...
tức
<SetParameter Id="CustomAction1" Before="CustomAction1" Value="data" Sequence="execute"/>
<CustomAction Id="CustomAction1" BinaryKey="BinaryId" DllEntry="MethodName" Execute="deferred"/>
... sau đó toàn bộ blob có thể được lấy ra sử dụng:
string data = session["CustomActionData"];
Alexey, cảm ơn bạn đã dành thời gian viết bài này. Đây thực sự là một sự trợ giúp lớn đối với tôi. Rất tiếc, tôi chỉ có thể cung cấp cho bạn +1 ... –
Như @TimLong đã nói, cảm ơn rất nhiều. Ước gì tôi có thể +1 cái này nhiều lần. –
Không hiểu nó cho đến khi tôi thực sự chạy nó. Rồi tôi thấy logic. Cách để ít thông tin dễ đọc về chủ đề này. Cảm ơn! – Wolf5