2012-07-03 14 views
5

के साथ .net विंडोज सेवा स्थापित करना मैं अपनी विंडोज सेवा के लिए एक सेटअप बनाना चाहता हूं। मेरी विंडोज़ सेवा के डीएलएस/लीब/फ़ोल्डर में रखे गए हैं।lib फ़ोल्डर

मैंने सेवा में एक इंस्टॉलर क्लास जोड़ा। और सेटअप प्रोजेक्ट पर एक कस्टम कार्रवाई जोड़ा। त्रुटि 1001 संस्थापक प्रकार प्राप्त करने के लिए ...

यह त्रुटि इसलिए होता है क्योंकि DLLs ही में नहीं हैं असमर्थ: यह त्रुटि के साथ विफल -

समस्या यह है कि जब मैं सेवा स्थापित करने का प्रयास है सेवा .exe के रूप में निर्देशिका। मैं सेवा config में जांच और स्थापित util को नहीं पहचानता है कि जांच कर ..

मुझे लगता है कि समस्या के लिए चारों ओर एक काम खोजने के लिए करना चाहता था और कई मायनों में tryed सेवा नियंत्रक (अनुसूचित जाति का उपयोग कर सेवा बनाने के लिए उपयोग कर रहा हूँ। प्रोग्राम फ़ाइल)। Cmd.exe का उपयोग कर इसे एक कस्टम कार्रवाई के रूप में चलाने की कोशिश कर रहा है। आदि ..

यह एक आम समस्या होनी चाहिए ... क्या किसी को इसके लिए उचित समाधान मिल रहा है?

उत्तर

0

आपको AppDomain.AssemblyResolve ईवेंट से जुड़ना चाहिए और ईवेंट हैंडलर में अपनी कस्टम लोडिंग करना चाहिए।

this SO question के पहले उत्तर में एक नमूना पाया जा सकता है।

+0

वर्तमान में मैं सिर्फ बाध्यकारी config उपयोग कर रहा हूँ .. यही कारण है कि स्थापित util DLLs को नहीं पहचानता है .. सेवा जब मैं Sc.exe .. का उपयोग यह सिर्फ InstallUtil का उपयोग कर नहीं चलता चलती है, – Lee

+0

@Lior: मैंने अभी अपना जवाब हटा दिया है क्योंकि मुझे लगता है कि यह काम करेगा। InstallUtil को आपकी असेंबली को सीएलआर में लोड करना होगा, जिस समय आपकी सभी निर्भरताओं के लिए 'AppDomain.AssemblyResolve' ईवेंट उठाया जाएगा। कृपया इसे एक कोशिश का मौका दीजिए। यह समझ में आता है (कम से कम मेरे लिए)। –

0
अपने config में

आप पथ की जांच कर सकते हैं जोड़ने - यह क्रम एक विधानसभा http://msdn.microsoft.com/en-us/library/823z9h8w%28v=vs.80%29.aspx

+0

मैं जांच का उपयोग कर रहा हूँ। उपयोग स्थापित करें कॉन्फ़िगर नहीं पढ़ता है, मैंने यह कहा है। – Lee

2

मैं एक ही समस्या मिला है देखने के लिए जहां के लिए एक संकेत है, और विकल्पों में से कोई भी इस पद या MSDN में सुझाव दिया मदद की। मैं एक और समाधान लगा:

InstallUtil.exe पर परावर्तक का उपयोग करके, मुझे पता चला कि InstallUtil केवल System.Configuration.Install.ManagedInstallerClass.InstallHelper(args) बुला आज़माएं/कैच ब्लॉक के अंदर के लिए एक पतली आवरण है (यह भी वर्तमान धागा के यूआई संस्कृति सेट और कॉपीराइट प्रदर्शित करता है)। ManagedInstallerClass.InstallHelper स्वयं सिस्टम में रहता है। कॉन्फ़िगरेशन.इनस्टॉल.dll असेंबली, सभी के लिए सुलभ। इस प्रकार, मैंने बस स्थापना की अनुमति देने के लिए मेरी सेवा के Program.Main विधि को संशोधित किया। नीचे त्वरित और गंदे कोड देखें:

static class Program 
{ 
    static void Main(string[] args) 
    { 
     if (args != null && args.Any(arg => arg == "/i" || arg == "/u")) 
     { 
      // Install or Uninstall the service (mimic InstallUtil.exe) 
      System.Configuration.Install.ManagedInstallerClass.InstallHelper(args); 
     } 
     else 
     { 
      // Run the service 
      System.ServiceProcess.ServiceBase[] ServicesToRun; 
      ServicesToRun = new System.ServiceProcess.ServiceBase[] 
      { 
       new MyService() 
      }; 
      System.ServiceProcess.ServiceBase.Run(ServicesToRun); 
     } 
    } 
} 

आप ऐसा कर सकते हैं, या InstallUtil का अपना संस्करण बना सकते हैं।

+0

यह एक अच्छा समाधान है और मेरे लिए काम किया है। जब असेंबली लोडर एप्लिकेशन संदर्भ में निष्पादित करता है, तो यह InstallUtil.exe के विपरीत, जांचपैथ का उपयोग करके अपनी स्वयं की असेंबली पा सकता है, जो exe.config का सम्मान नहीं करता है –

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