2010-08-13 4 views
9

इंस्टॉल करें, विंडोज़ में एक्सएमएल टूलसेट स्थापित करें, एक सेवा स्थापित करने के लिए, हम <ServiceInstall> को <File><Component> में समूहबद्ध करते हैं। सशर्त रूप से सेवा स्थापित करने के लिए, हमने <Condition> को <Component> के तहत रखा है। हालांकि अगर स्थिति गलत है, तो फ़ाइल भी इंस्टॉल नहीं की जाएगी। अगर मैंने बिना शर्त <Component> में <File> डाला है, तो सेवा में कोई निष्पादन योग्य फ़ाइल पथ नहीं है और इस प्रकार स्थापना विफल हो जाएगी। अगर मैं <Component> दोनों में <File> डालता हूं, तो डुप्लिकेट प्रतीकों पाए जाएंगे।वाईएक्स: इंस्टॉल सर्विसेज सशर्त रूप से, लेकिन फ़ाइल को बिना शर्त

सवाल यह है कि, क्या हम सशर्त रूप से सेवा स्थापित कर सकते हैं, लेकिन संबंधित निष्पादन योग्य फ़ाइल को बिना शर्त इंस्टॉल कर सकते हैं?

धन्यवाद!

+1

सर्विसइनस्टॉल/@ स्टार्ट विशेषता को [संपत्ति] पर सेट किया जा सकता है, तो यह वास्तव में अच्छा होगा, ताकि आप इसे शुरू किए बिना सेवा इंस्टॉल कर सकें। – Ivan

उत्तर

5

विभिन्न GUIDs और Ids 'और पारस्परिक रूप से अनन्य स्थितियों के साथ दो घटक बनाएं: एक फ़ाइल और सेवा के लिए, और दूसरा केवल फ़ाइल के लिए। कुछ इस तरह:

<Component Id="SvcComp" Guid="{YOUR-GUID}" SharedDllRefCount="yes"> 
    <Condition> SOME_CONDITION </Condition> 
    <File Id="SvcFile" Name="Service.exe" Source="Service.exe" Vital="yes" /> 
    <ServiceInstall Id="Svc" Name="Service" DisplayName="Service" Description="Service" Type="ownProcess" Start="auto" ErrorControl="normal" Vital="yes" /> 
    <ServiceControl Id="Svc" Name="Service" Stop="both" Remove="uninstall" Wait="yes" /> 
</Component> 

<Component Id="ExeComp" Guid="{YYOUR-GUID}" SharedDllRefCount="yes" > 
    <Condition> NOT SOME_CONDITION </Condition> 
    <File Id="ExeFile" Name="Service.exe" Source="Service.exe" Vital="yes" /> 
</Component> 

आप एक LGHT1076 चेतावनी जो बाद से घटकों में स्थिति परस्पर अनन्य हैं दबा दिया जा सकता है मिल जाएगा।

+0

आपकी सलाह के लिए धन्यवाद, मैंने पाया कि जो मैंने याद किया वह फ़ाइल आईडी है। अलग-अलग आईडी के साथ एक ही नाम के साथ, एक ही फ़ाइल अलग-अलग ' 'में मौजूद हो सकती है। –

+1

वह तकनीकी रूप से काम करता है लेकिन आपको आईसीई सत्यापन त्रुटियां मिलेंगी क्योंकि दोनों घटकों में एक ही कीपैथ है। यह एक साफ समाधान नहीं है। –

1

मैं इस सड़क से नीचे गया हूं और यह जटिल हो जाता है तो कोई उम्मीद करेगा।

मुझे एक ही कीफाइल के साथ दो घटक (उनके पारस्परिक रूप से अनन्य सशर्त अभिव्यक्तियों के बावजूद) होने पर विचार करते हैं लेकिन विभिन्न सर्विसइनस्टॉल/नियंत्रण संसाधन एक घटक नियम उल्लंघन करते हैं।

जिस तरह से मैं सुझाव देता हूं कि यह आपके सभी व्यावसायिक तर्क को एक अलग डीएलएल घटक में ले जाये और दो अलग-अलग EXE घटकों को बनाये। कंसोल/विंडोज ऐप के रूप में एक सेट करें और दूसरा सर्विस ऐप के रूप में सेट करें। घटक को दो अलग-अलग विशेषताओं में आवंटित करें ताकि अंतिम उपयोगकर्ता यह तय कर सके कि वह किस प्रकार एप्लिकेशन को कॉन्फ़िगर करना चाहता है। उपयोगकर्ता प्रोग्राम जोड़ने/निकालने में एक संशोधित ऑपरेशन कर सकता है और बाद में अपना दिमाग बदलने के लिए एमएसआई का उपयोग कर सकता है।

2

यदि आपके पास केवल एक सेवा है, तो आप InstallExecuteSequence तालिका में सेवा कार्रवाइयों को हालत कर सकते हैं।

वैकल्पिक रूप से, आपको तत्काल चरण के दौरान सीए चलाने की ज़रूरत है, जो स्थगित रूप से स्थगित होने के दौरान निष्पादन से पहले सेवा तालिका से प्रविष्टि को हटा देता है।

मैं किसी भी कारण से डीएलएल को विभाजित करने का प्रशंसक नहीं हूं।

+0

एकाधिक असेंबली में कई वर्गों में कोड को कारक करने के लिए यह उचित एप्लिकेशन डिज़ाइन है। आप एक असेंबली बनाते हैं जिसमें सर्वर घटक होते हैं और आप कंसोल होस्ट और सर्विस होस्ट के रूप में कार्य करने के लिए दो असेंबली बनाते हैं। आपके द्वारा किए गए सुझाव केवल हैक एमएसआई बनाते हैं जो सर्वोत्तम प्रथाओं का पालन नहीं करते हैं। –

संबंधित मुद्दे