2012-06-27 32 views

उत्तर

110

डिफर्ड कस्टम क्रियाएं सीधे इंस्टॉलर गुणों (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> 
+5

एलेक्सी, इसे लिखने के लिए समय निकालने के लिए धन्यवाद। यह मेरे लिए वास्तव में एक बड़ी मदद रही है। दुर्भाग्यवश मैं आपको केवल +1 दे सकता हूं ... –

+0

@TimLong ने कहा, एक बहुत धन्यवाद। इच्छा है कि मैं इसे कई बार +1 कर सकता हूं। –

+0

इसे तब तक समझ में नहीं आया जब तक कि मैं वास्तव में इसे चलाता था। तब मैंने तर्क देखा। इस विषय पर थोड़ी अच्छी पठनीय जानकारी के लिए रास्ता। धन्यवाद! – Wolf5

6

हमें सी schlubs ++ के लिए, आप संपत्ति को पुनः प्राप्त इस प्रकार है:

MsiGetProperty(hInstall, "CustomActionData", buf, &buflen); 

तो फिर तुम 'buf' पार्स। Bondbhai पर धन्यवाद।

2

तो कस्टम क्रिया को भेजे गए मान एक कुंजी/जोड़ी सेट नहीं है ...

<SetParameter Id="CustomAction1" Before="CustomAction1" Value="data" Sequence="execute"/> 
<CustomAction Id="CustomAction1" BinaryKey="BinaryId" DllEntry="MethodName" Execute="deferred"/> 

... तो पूरे ब्लॉब का उपयोग कर प्राप्त किया जा सकता है यानी:

string data = session["CustomActionData"];