2011-03-14 13 views
15

को रोकने और पुनरारंभ करने के लिए प्री और पोस्ट बनाएं I प्रोजेक्ट में निर्मित विंडोज सेवा को शुरू और बंद करने के लिए बिल्ड इवेंट्स का उपयोग करने के साथ प्रयोग कर रहा हूं। हालांकि पूर्व & पोस्ट बिल्ड के लिए एक त्रुटि स्तर 255 के साथ विफल रहता है। मैंने बिना किसी किस्मत के प्री-बिल्ड के साथ इसे पकड़ने का प्रयास किया है।ईवेंट विंडोज सेवा

पूर्व निर्माण

if "$(ConfigurationName)" == "Debug" 
(
net stop myService 
if errorlevel 2 
    if errorlevel 255 
     :exit 

    :exit 
) 

के बाद निर्माण

if "$(ConfigurationName)" == "Release" 
(
    copy $(TargetDir) C:\Media\Bin\$(ProjectName) 
    if errorlevel 1 BuildEventFailed 

    :BuildEventFailed 
    mkdir C:\Media\Bin\$(ProjectName) 

    copy $(TargetDir) C:\Media\Bin\$(ProjectName) 
) 
else if "$(ConfigurationName)" == "Debug" 
(
    net start myService 
) 

उत्तर

1

अपने पूर्व निर्माण कोड की पहली पंक्ति

21

योएल Varty द्वारा निम्नलिखित वेबलॉग है पर उद्घाटन Parenthese उपयोग करने का प्रयास एक समाधान जो मैं उपयोग करता हूं: Use Build Events to rebuild a Windows Service without having to manually stop/start it

एकमात्र समस्या तब होती है जब आप पुनर्निर्माण करते हैं। विजुअल स्टूडियो प्री-बिल्ड इवेंट आग से पहले फ़ाइलों को साफ़ करता है। यह तब बंद हो जाता है क्योंकि सेवा अभी भी चल रही है। लेकिन नियमित रूप से महान काम करता है। उम्मीद है की यह मदद करेगा।

+3

मैं, 'प्रति है बंद करो,, शुरू करने के लिए पसंद करते हैं exit' सभी में बाद के निर्माण के बाद से सेवा पथ शायद एक करने के लिए सीधे बात नहीं करनी चाहिए/बिन/रिलीज फ़ोल्डर। यह सेवा को रोकने से रोकता है लेकिन अगर निर्माण अन्य कारणों से विफल रहता है तो कभी भी पुनरारंभ नहीं होता है। – Dan

+2

@Dan का सही उत्तर है। यह आपको सेवा को पुनर्स्थापित/पुनर्स्थापित किए बिना आसानी से विभिन्न बिल्ड कॉन्फ़िगरेशन, शाखाओं आदि पर स्विच करने देता है। एसडीएम के लिंक में एक टिप्पणी से, आप सेवा को स्वतः इंस्टॉल भी कर सकते हैं ताकि नए डेवलपर्स के लिए यह काम करता है। –

1

सशर्त बयान की आवश्यकता नहीं है डबल qoute ("")

यह होना चाहिए

if $(ConfigurationName) == Debug (
net stop myService 
... 
) 
+0

मेरा मानना ​​है कि परिवर्तनीय खाली होने पर हमेशा उद्धरणों का उपयोग करना आम बात है, अन्यथा आप 'if ==" डीबग "के बजाय' if == डीबग 'के साथ समाप्त हो सकते हैं। हालांकि, इस मामले में '$ (ConfigurationName)' * * हमेशा एक मान होना चाहिए। –

+0

सुनिश्चित नहीं है। जब मैंने जोड़ा "", यह दृश्य स्टूडियो – Andy

+0

पर मेरे लिए काम नहीं करता है आप सही हो सकते हैं। मैंने बैच फ़ाइलों में कई बार अभ्यास देखा है और माना है कि यह मामला था। एक त्वरित खोज ऑनलाइन के साथ मुझे वास्तव में कुछ भी निश्चित नहीं मिला। –

0

यह वह जगह है जैसे मैं यह कैसे काम मिल गया:

(इस समाधान एंटरप्राइज़ सॉफ़्टवेयर का एक हिस्सा था जहां कुछ डीएल फाइलों को किसी अन्य ऐप द्वारा पुन: उपयोग किया जाता है)

मॉडल एक प्रोजेक्ट है जो रेफरी है सेवा प्रोजेक्ट में erenced और यह सेवा से पहले बनाया गया है। कौन सा कारण है कि हम में मॉडल के घटनाक्रम पूर्व बिल्ड इन कोड लिखें:


मॉडल प्री-बिल्ड घटना:

if not exist "$(SolutionDir)UI\bin\Debug\ServiceFolder" mkdir "$(SolutionDir)UI\bin\Debug\ServiceFolder" 

net start | find "[Service Name]" 

if ERRORLEVEL 0 (
net stop "Service Name" 
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" -u "$(SolutionDir)UI\bin\Debug\ServiceFolder\Service.exe" 
) 

exit 0 
  • आउटपुट फ़ोल्डर
  • में एक निर्देशिका बनाता है नाम से सेवा पाता है
  • इसे रोकता है
  • इसे अनइंस्टॉल करता है
  • बाहर निकलने के 0 यदि त्रुटि यहाँ होता है जारी रखने के लिए निर्माण प्रक्रिया का कारण बनता है

सेवा के बाद बिल्ड घटना:

xcopy /E /Y "$(ProjectDir)bin\Debug\*" "$(SolutionDir)UI\bin\Debug\ServiceFolder" 
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" "$(SolutionDir)UI\bin\Debug\ServiceFolder\Service.exe" 
net start "Service Name" 
  • किसी दूसरे फ़ोल्डर में
  • इंस्टॉल पर सेवा के लिए आवश्यक सब कुछ नकल सेवा
  • सेवा शुरू होती है

अनुमतियों के बारे में?

  • दृश्य स्टूडियो ऊंचा अनुमति मांगेगा स्वचालित रूप से