एक स्थगित कस्टम कार्रवाई द्वारा पुनर्प्राप्त किए जाने के लिए CustomActionData पर गुण कैसे सेट किए गए हैं?वाईएक्स का उपयोग कर कस्टमएक्शन में कस्टमएक्शनडेटा कैसे पास करें?
उत्तर
डिफर्ड कस्टम क्रियाएं सीधे इंस्टॉलर गुणों (reference) तक नहीं पहुंच सकती हैं। वास्तव में, केवल CustomActionData
संपत्ति
session.CustomActionData
और अन्य तरीकों और गुण सूचीबद्ध here सत्र वस्तु पर उपलब्ध हैं। यानी एक सेट संपत्ति कस्टम क्रिया - -
इसलिए, के लिए एक आस्थगित कस्टम क्रिया ऐसे INSTALLLOCATION
के रूप में एक संपत्ति को पुनः प्राप्त करने के लिए, आप एक प्रकार 51 कस्टम क्रिया का उपयोग करने के साथ उस जानकारी को पारित करने के लिए और आप डेटा का उपभोग करेंगे कस्टमएक्शन के सी # कोड से session.CustomActionData
के माध्यम से। (देखें reference & reference)
नीचे एक प्रकार 51 कस्टम क्रिया (CustomAction1
) है कि एक संपत्ति है कि CustomAction2
में प्राप्त किए जा सकें सेट हो जाएगा का एक उदाहरण है।
<CustomAction Id="CustomAction1"
Property="CustomAction2"
Value="SomeCustomActionDataKey=[INSTALLLOCATION]"
/>
सूचना है कि Property
विशेषता नाम CustomAction2
है। यह महत्वपूर्ण है। प्रॉपर्टी एट्रिब्यूट का प्रकार 51 एक्शन का मान CustomActionData
उपभोग करने वाले कस्टम एक्शन के नाम के बराबर/समान होना चाहिए। (देखें reference)
सूचना नाम Value
में SomeCustomActionDataKey
विशेषता मुख्य/मान जोड़े? लेने वाली कस्टम क्रिया (CustomAction2
) में सी # कोड में, आपको निम्न अभिव्यक्ति का उपयोग करके CustomActionData
से देखने-अप है कि संपत्ति:
string somedata = session.CustomActionData["SomeCustomActionDataKey"];
महत्वपूर्ण यह है कि आप CustomActionData
से मान प्राप्त करने के लिए उपयोग नहीं है Property
में टाइप 51 कस्टम एक्शन की विशेषता है, लेकिन key=value
की कुंजी Value
विशेषता में जोड़ी है। (महत्वपूर्ण टेकअवे:। CustomActionData
एक इंस्टॉलर संपत्ति लेने वाली कस्टम क्रिया की आईडी के रूप में एक ही नाम है कि स्थापित करने की आबादी है, लेकिन CustomActionData
कुंजी गुण इंस्टॉलर नहीं कर रहे हैं) (reference देखें)
हमारे परिदृश्य में लेने वाली कस्टम क्रिया एक आस्थगित कस्टम क्रिया को कुछ हद तक नीचे की तरह परिभाषित किया गया है:
<Binary Id="SomeIdForYourBinary" SourceFile="SomePathToYourDll" />
<CustomAction Id="CustomAction2"
BinaryKey="SomeIdForYourBinary"
DllEntry="YourCustomActionMethodName"
Execute="deferred"
Return="check"
HideTarget="no"
/>
InstallExecuteSequence
बेशक, विन्यास उपभोग करने वाली कस्टम कार्रवाई (CustomAction2
) टाइप 51 कस्टम एक्शन (CustomAction1
) के बाद चलनी चाहिए। तो अगर आप इस तरह से उन्हें शेड्यूल करने के लिए होगा:
<InstallExecuteSequence>
<!--Schedule the execution of the custom actions in the install sequence.-->
<Custom Action="CustomAction1" Before="CustomAction2" />
<Custom Action="CustomAction2" After="[SomeInstallerAction]" />
</InstallExecuteSequence>
हमें सी schlubs ++ के लिए, आप संपत्ति को पुनः प्राप्त इस प्रकार है:
MsiGetProperty(hInstall, "CustomActionData", buf, &buflen);
तो फिर तुम 'buf' पार्स। Bondbhai पर धन्यवाद।
तो कस्टम क्रिया को भेजे गए मान एक कुंजी/जोड़ी सेट नहीं है ...
<SetParameter Id="CustomAction1" Before="CustomAction1" Value="data" Sequence="execute"/>
<CustomAction Id="CustomAction1" BinaryKey="BinaryId" DllEntry="MethodName" Execute="deferred"/>
... तो पूरे ब्लॉब का उपयोग कर प्राप्त किया जा सकता है यानी:
string data = session["CustomActionData"];
एलेक्सी, इसे लिखने के लिए समय निकालने के लिए धन्यवाद। यह मेरे लिए वास्तव में एक बड़ी मदद रही है। दुर्भाग्यवश मैं आपको केवल +1 दे सकता हूं ... –
@TimLong ने कहा, एक बहुत धन्यवाद। इच्छा है कि मैं इसे कई बार +1 कर सकता हूं। –
इसे तब तक समझ में नहीं आया जब तक कि मैं वास्तव में इसे चलाता था। तब मैंने तर्क देखा। इस विषय पर थोड़ी अच्छी पठनीय जानकारी के लिए रास्ता। धन्यवाद! – Wolf5