2012-06-27 26 views

Trả lời

110

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> 
+5

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 ... –

+0

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. –

+0

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

6

Đố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.

2

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"];