Visual Studio का उपयोग करके .net Windows सेवा के लिए एक इंस्टॉलर कैसे बनाया जाए


152

मैं एक Windows सेवा के लिए एक इंस्टॉलर कैसे बनाऊं जिसे मैंने Visual Studio का उपयोग करके बनाया है?


यह पहले से ही निम्न Microsoft KB आलेख में दर्ज़ है: support.microsoft.com/en-us/kb/816169
slayernoah

जवाबों:


227

सेवा परियोजना में निम्नलिखित कार्य करें:

  1. समाधान एक्सप्लोरर में अपनी सेवाओं .cs फ़ाइल पर डबल क्लिक करें। यह एक स्क्रीन को लाना चाहिए जो सभी ग्रे है और टूलबॉक्स से सामान खींचने के बारे में बात करता है।
  2. फिर ग्रे क्षेत्र पर राइट क्लिक करें और एड इंस्टॉलर का चयन करें। यह आपके प्रोजेक्ट में इंस्टॉलर प्रोजेक्ट फ़ाइल जोड़ देगा।
  3. तब आपके पास ProjectInstaller.cs (serviceProcessInstaller1 और serviceInstaller1) के डिज़ाइन दृश्य पर 2 घटक होंगे। आपको तब गुणों को सेटअप करना चाहिए, जैसे कि आपको सेवा नाम और उपयोगकर्ता की आवश्यकता होती है, जिसे इसे चलाना चाहिए।

अब आपको एक सेटअप प्रोजेक्ट बनाने की आवश्यकता है। सबसे अच्छी बात सेटअप विज़ार्ड का उपयोग करना है।

  1. अपने समाधान पर राइट क्लिक करें और एक नया प्रोजेक्ट जोड़ें:> नया प्रोजेक्ट> सेटअप और परिनियोजन प्रोजेक्ट> सेटअप विज़ार्ड जोड़ें

    ए। यह विजुअल स्टूडियो के विभिन्न संस्करणों के लिए थोड़ा भिन्न हो सकता है। ख। विजुअल स्टूडियो 2010 यह इसमें स्थित है: टेम्प्लेट स्थापित करें> अन्य प्रोजेक्ट प्रकार> सेटअप और परिनियोजन> विज़ुअल स्टूडियो इंस्टॉलर

  2. दूसरे चरण पर "विंडोज एप्लिकेशन के लिए एक सेटअप बनाएं" चुनें।

  3. तीसरे चरण पर, "से प्राथमिक उत्पादन ..." चुनें

  4. फिनिश के माध्यम से क्लिक करें।

अगला यह सुनिश्चित करने के लिए अपने इंस्टॉलर को संपादित करें कि सही आउटपुट शामिल है।

  1. अपने समाधान एक्सप्लोरर में सेटअप प्रोजेक्ट पर राइट क्लिक करें।
  2. दृश्य> कस्टम क्रियाएँ चुनें। (VS2008 में यह दृश्य हो सकता है> संपादक> कस्टम क्रिया)
  3. कस्टम एक्शन ट्री में इंस्टॉल एक्शन पर राइट-क्लिक करें और 'कस्टम एक्शन जोड़ें ...' चुनें
  4. "प्रोजेक्ट में आइटम का चयन करें" संवाद में, एप्लिकेशन फ़ोल्डर का चयन करें और ठीक पर क्लिक करें।
  5. "प्राथमिक आउटपुट से ..." विकल्प चुनने के लिए ठीक क्लिक करें। एक नया नोड बनाया जाना चाहिए।
  6. दोहराएँ कदम 4 - 5 के लिए प्रतिबद्ध, रोलबैक और कार्यों की स्थापना रद्द करें।

आप इंस्टॉलर आउटपुट नाम को अपने समाधान में इंस्टॉलर प्रोजेक्ट पर राइट क्लिक करके और गुणों का चयन करके संपादित कर सकते हैं। जो भी आप चाहते हैं, 'आउटपुट फ़ाइल नाम:' बदलें। साथ ही संस्थापक परियोजना का चयन करके और गुण खिड़कियों को देख कर, आप संपादित कर सकते हैं Product Name, Title, Manufacturer, आदि ...

अगला अपने इंस्टॉलर का निर्माण करें और यह एक MSI और एक setup.exe का उत्पादन करेगा। जो भी आप अपनी सेवा को तैनात करने के लिए उपयोग करना चाहते हैं उसे चुनें।


37
@ एल रोन्नोको, मेरे पास पोस्ट करने से पहले जवाब था। मैं इसे यहाँ दस्तावेज़ित करना चाहता था क्योंकि मैं हमेशा इसे हर 6 - 12 महीनों में देख रहा हूँ (और इसे खोजना इतना आसान नहीं था) इसलिए अब मेरे पास इसे आसानी से सभी के लिए खोजा जा सकता है और मैं इसे जल्दी से पा सकता हूँ :)
केलसी

1
दुर्भाग्य से, यह भी गलत जवाब है। हाँ, मुझे पता है कि आप इसे किताबों और MSDN में पाएंगे, लेकिन यह एक ऐसा मामला है जहाँ Microsoft में एक समूह ने Microsoft के दूसरे समूह से बात नहीं की और एक समस्या का एक अवर समाधान के साथ आया जो पहले ही हल हो गई थी। अधिक जानकारी के लिए blog.iswix.com/2006/07/msi-vs-net.html देखें ।
क्रिस्टोफर पेंटर

9
@ क्रिस्‍टोफर पेंटर मैं 2k5 से एमएस इंस्टॉलर का उपयोग कर रहा हूं और इसे कभी कोई समस्या नहीं हुई। आप इससे सहमत हैं या नहीं और इसे 'एंटी-पैटर्न' मानते हैं, यह इस सवाल का बिंदु नहीं है, यह है कि मैं y के साथ x कैसे करता हूं, न कि मैं b के साथ कैसे करूं। जब मैंने प्रश्न पोस्ट किया तो यह दस्तावेजी उद्देश्यों के लिए था।
केल्सी

3
तो फिर तुम 6 साल के लिए भाग्यशाली हो रहे हो तुम यह नहीं जानते। आप पढ़ना चाह सकते हैं: robmensching.com/blog/posts/2007/4/19/…
क्रिस्टोफर पेंटर

1
यदि आपको Service name contains invalid characters, is empty, or is too long (max length = 80)इंस्टॉलर को जोड़ने के दौरान कोई त्रुटि मिलती है , तो फिर से ग्रे क्षेत्र में राइट क्लिक करें, गुण पर जाएं और यह सुनिश्चित करें कि सेवा नाम मान सेट है।
वुल्फ्युक

51

मैं अपनी सेवा परियोजना में इंस्टॉलर कक्षाओं को जोड़ने के लिए केल्सी के पहले सेट का पालन करता हूं, लेकिन मैं MSI या setup.exe इंस्टॉलर बनाने के बजाय सेवा को स्वयं स्थापित / अनइंस्टॉल कर रहा हूं। यहां मेरी सेवाओं में से एक नमूना कोड है जिसे आप एक प्रारंभिक बिंदु के रूप में उपयोग कर सकते हैं।

public static int Main(string[] args)
{
    if (System.Environment.UserInteractive)
    {
        // we only care about the first two characters
        string arg = args[0].ToLowerInvariant().Substring(0, 2);

        switch (arg)
        {
            case "/i":  // install
                return InstallService();

            case "/u":  // uninstall
                return UninstallService();

            default:  // unknown option
                Console.WriteLine("Argument not recognized: {0}", args[0]);
                Console.WriteLine(string.Empty);
                DisplayUsage();
                return 1;
        }
    }
    else
    {
        // run as a standard service as we weren't started by a user
        ServiceBase.Run(new CSMessageQueueService());
    }

    return 0;
}

private static int InstallService()
{
    var service = new MyService();

    try
    {
        // perform specific install steps for our queue service.
        service.InstallService();

        // install the service with the Windows Service Control Manager (SCM)
        ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });
    }
    catch (Exception ex)
    {
        if (ex.InnerException != null && ex.InnerException.GetType() == typeof(Win32Exception))
        {
            Win32Exception wex = (Win32Exception)ex.InnerException;
            Console.WriteLine("Error(0x{0:X}): Service already installed!", wex.ErrorCode);
            return wex.ErrorCode;
        }
        else
        {
            Console.WriteLine(ex.ToString());
            return -1;
        }
    }

    return 0;
}

private static int UninstallService()
{
    var service = new MyQueueService();

    try
    {
        // perform specific uninstall steps for our queue service
        service.UninstallService();

        // uninstall the service from the Windows Service Control Manager (SCM)
        ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });
    }
    catch (Exception ex)
    {
        if (ex.InnerException.GetType() == typeof(Win32Exception))
        {
            Win32Exception wex = (Win32Exception)ex.InnerException;
            Console.WriteLine("Error(0x{0:X}): Service not installed!", wex.ErrorCode);
            return wex.ErrorCode;
        }
        else
        {
            Console.WriteLine(ex.ToString());
            return -1;
        }
    }

    return 0;
}

1
जिज्ञासा से बाहर, सेल्फ-इनस्टॉलिंग / अन-इनस्टॉलिंग सेवा होने का क्या लाभ है? यदि सेवा स्वयं स्थापित होती है, तो आप सेवा को पहले कैसे शुरू करते हैं ताकि इसे पहली जगह पर स्थापित किया जा सके? यदि इसे स्थापित किए बिना सेवा शुरू करने के लिए एक तंत्र है, तो इसे स्थापित करने में परेशान क्यों करें?
केली नरो

3
@ क्रिस्टोफर - मैं नहीं। मेरा समाधान एक पूर्ण इंस्टॉलर के लिए एक प्रतिस्थापन नहीं है जिसे आप सॉफ़्टवेयर वितरित करने के लिए उपयोग करेंगे। मैं एक और विकल्प पेश कर रहा हूं जो कुछ स्थितियों के लिए काम करता है, जैसे कि मेरा जहां मैं सॉफ्टवेयर लिखता हूं जो अनअटेंडेड कियोस्क में एम्बेडेड पीसी चलाता है।

4
जब आप इसे उत्पादन मशीन पर स्थापित करते हैं, तो इसे व्यवस्थापक के रूप में चलाना याद रखें। मैंने एक BAT फ़ाइल बनाई जो EXE फ़ाइल को / i पैरामीटर के साथ कॉल करती है, लेकिन यह उत्पादन वातावरण पर काम नहीं करती, भले ही मैंने BAT फ़ाइल को एक व्यवस्थापक के रूप में निष्पादित किया हो। मुझे प्रशासक के रूप में कमांड लाइन प्रॉम्प्ट खोलना था और EXE फ़ाइल / i को स्पष्ट रूप से लागू करना था (बिना बैट फ़ाइल का उपयोग किए)। कम से कम मेरे साथ विंडोज सर्वर 2012 पर हुआ।
फ्रांसिस्को गोल्डनस्टीन

1
पुन: कमांड लाइन पर कोई आउटपुट नहीं। वीएस 2017 समुदाय का उपयोग करके मेरी नई सेवा परियोजना आउटपुट प्रकार: Windows Applicationऔर स्टार्टअप ऑब्जेक्ट: के लिए डिफ़ॉल्ट हो गई (none)। मुझे Console Applicationअपने स्टार्टअप ऑब्जेक्ट उदा myservice.Program। को आउटपुट प्रकार बदलना और सेट करना था । अगर कोई ऐसी गड़बड़ी हो सकती है जिससे मैं अनजान हूं, तो कृपया सलाह दें।
जोनाथन

1
क्या उदाहरण कोड में टाइपो है? तीन अंतर सेवाएँ (CSMessageQueueService, MyService, MyQueueService) क्यों हैं?
निल्स गुइलर्मिन

27

न ही केल्सी, और न ही ब्रेंडन समाधान विजुअल स्टूडियो 2015 समुदाय में मेरे लिए काम नहीं करता है।

यहाँ मेरा संक्षिप्त कदम है कि इंस्टॉलर के साथ सेवा कैसे बनाई जाए:

  1. विजुअल स्टूडियो चलाएं, पर जाएं File->New->Project
  2. 'खोज स्थापित टेम्पलेट ' सेवा ' में .NET फ्रेमवर्क 4 का चयन करें
  3. 'विंडोज सेवा' का चयन करें। नाम और स्थान लिखें। प्रेस करें OK
  4. डबल क्लिक करें Service1.cs, डिजाइनर में राइट क्लिक करें और 'इंस्टॉलर जोड़ें' चुनें
  5. डबल क्लिक करें ProjectInstaller.cs। ServiceProcessInstaller1 के लिए गुण टैब खोलें और 'खाता' गुण मान को 'LocalService' में बदलें। ServiceInstaller1 के लिए 'ServiceName' बदलें और 'StartType' को 'Automatic' में सेट करें।
  6. डबल क्लिक करें serviceInstaller1। विजुअल स्टूडियो serviceInstaller1_AfterInstallइवेंट बनाता है । कोड लिखें:

    private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
    {
        using (System.ServiceProcess.ServiceController sc = new 
        System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
        {
            sc.Start();
        }
    }
  7. समाधान बनाएँ। प्रोजेक्ट पर राइट क्लिक करें और 'फाइल एक्सप्लोरर में ओपन फोल्डर' चुनें। बिन \ _ डिबग पर जाएं ।

  8. नीचे स्क्रिप्ट के साथ install.bat बनाएँ:

    :::::::::::::::::::::::::::::::::::::::::
    :: Automatically check & get admin rights
    :::::::::::::::::::::::::::::::::::::::::
    @echo off
    CLS 
    ECHO.
    ECHO =============================
    ECHO Running Admin shell
    ECHO =============================
    
    :checkPrivileges 
    NET FILE 1>NUL 2>NUL
    if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges ) 
    
    :getPrivileges 
    if '%1'=='ELEV' (shift & goto gotPrivileges)  
    ECHO. 
    ECHO **************************************
    ECHO Invoking UAC for Privilege Escalation 
    ECHO **************************************
    
    setlocal DisableDelayedExpansion
    set "batchPath=%~0"
    setlocal EnableDelayedExpansion
    ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs" 
    ECHO UAC.ShellExecute "!batchPath!", "ELEV", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs" 
    "%temp%\OEgetPrivileges.vbs" 
    exit /B 
    
    :gotPrivileges 
    ::::::::::::::::::::::::::::
    :START
    ::::::::::::::::::::::::::::
    setlocal & pushd .
    
    cd /d %~dp0
    %windir%\Microsoft.NET\Framework\v4.0.30319\InstallUtil /i "WindowsService1.exe"
    pause
  9. स्थापना रद्द करें। फ़ाइल (पेन-परफेक्ट लाइन /iमें /u) में बदलें
  10. स्थापना रद्द करने और चलाने के लिए, स्थापना रद्द करें और स्थापना रद्द करने के लिए

14

VS2017 के लिए आपको "Microsoft Visual Studio 2017 इंस्टालर प्रोजेक्ट्स" VS एक्सटेंशन को जोड़ना होगा। यह आपको अतिरिक्त विजुअल स्टूडियो इंस्टॉलर प्रोजेक्ट टेम्पलेट देगा। https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects#overview

विंडोज़ सेवा को स्थापित करने के लिए आप एक नया सेटअप विज़ार्ड प्रकार परियोजना जोड़ सकते हैं और केल्सी के उत्तर https://stackoverflow.com/a/9021107/1040040 से चरणों का पालन कर सकते हैं


1

InstallUtil क्लासेस (ServiceInstaller) को विंडोज इंस्टालर समुदाय द्वारा एक विरोधी पैटर्न माना जाता है। यह एक नाजुक, प्रक्रिया से बाहर है, पहिया को फिर से स्थापित करना जो इस तथ्य को अनदेखा करता है कि विंडोज इंस्टालर ने सेवाओं के लिए अंतर्निहित समर्थन किया है।

विजुअल स्टूडियो परिनियोजन प्रोजेक्ट्स (विजुअल स्टूडियो की अगली रिलीज में भी उच्च माना और नहीं हटाया गया) सेवाओं के लिए मूल समर्थन नहीं है। लेकिन वे मर्ज मॉड्यूल का उपभोग कर सकते हैं। इसलिए मैं इस ब्लॉग लेख पर एक नज़र डालूंगा कि यह समझने के लिए कि विंडोज इंस्टॉलर एक्सएमएल का उपयोग करके मर्ज मॉड्यूल कैसे बनाया जाए जो सेवा को व्यक्त कर सकता है और फिर आपके वीडीपीआरओजे समाधान में उस मर्ज मॉड्यूल का उपभोग कर सकता है।

विंडोज इंस्टॉलर XML - विंडोज सर्विसेज का उपयोग करके इंस्टालेशन को स्थापित करना

IsWiX विंडोज सर्विस ट्यूटोरियल

IsWiX विंडोज सर्विस वीडियो


1
पुराने विज़ुअल स्टूडियो में आसान निर्माण इंस्टॉलर के साथ एक तैनाती परियोजना थी। अब मुझे थर्ड-पार्टी सॉफ्टवेयर कंपोनेंट खरीदना है?
एलेक्सी

@AlexeyObukhov आप मुफ्त में Wix का उपयोग कर सकते हैं, यह वही है जो VS खुद उपयोग करता है, लेकिन Wix के साथ समस्या Git के साथ समस्या के समान है - पास में वर्टिकल लर्निंग कर्व।
एलन बी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.