আমি ভিজ্যুয়াল স্টুডিওতে উইন্ডোজ পরিষেবাগুলি কীভাবে ডিবাগ করব?


85

ভিজ্যুয়াল স্টুডিওতে উইন্ডোজ পরিষেবাগুলি ডিবাগ করা সম্ভব?

আমি কোড পছন্দ করি

System.Diagnostics.Debugger.Break();

তবে এটি কিছু কোড ত্রুটি দিচ্ছে যেমন:

আমি দুটি ইভেন্টের ত্রুটি পেয়েছি: ইভেন্টআইডি 4096 ভিএসআইজিটি ডেগুগার এবং "সময়মত ফ্যাশনে পরিষেবাটি শুরু বা নিয়ন্ত্রণের অনুরোধের প্রতিক্রিয়া জানায় না।"

উত্তর:


124

পরিষেবা OnStartপদ্ধতিতে নিম্নলিখিত কোডটি ব্যবহার করুন :

System.Diagnostics.Debugger.Launch();

পপ আপ বার্তা থেকে ভিজ্যুয়াল স্টুডিও বিকল্পটি চয়ন করুন।

দ্রষ্টব্য: এটি কেবলমাত্র ডিবাগ মোডে #if DEBUGব্যবহার করতে , একটি সংকলক নির্দেশিকা নীচে ব্যবহার করা যেতে পারে। এটি কোনও প্রোডাকশন সার্ভারে রিলিজ মোডে দুর্ঘটনাজনিত বা ডিবাগিং প্রতিরোধ করবে।

#if DEBUG
    System.Diagnostics.Debugger.Launch();
#endif

9
প্রশাসক হিসাবে ভিএস চালাতে ভুলবেন না। তারপরে এটি তালিকায় পাওয়া যাবে।
মাইকেল

4
পপ আপ বার্তা বলতে কী বোঝাতে পারে কেউ স্পষ্ট করতে পারে? কখন / কীভাবে এটি প্রদর্শিত হয়?
মাইক

@ মাইক, ইনস্টল করুন এবং পরিষেবাটি শুরু করুন, এটি উপস্থিত হবে।
হর্ষিত

@ মাইক, এটি একটি উইন্ডোজ ডায়লগ বক্স যা ইন্টারেক্টিভ (লগ ইন) ডেস্কটপে পপ আপ করে এবং জিজ্ঞাসা করে যে আপনি কোনও অ্যাপ্লিকেশনটি প্রক্রিয়াটি ডিবাগ করার জন্য চয়ন করতে চান কিনা। আপনি যদি ভিএস বাছাই করেন এটি ডিবাগারটি চালু করবে এবং প্রক্রিয়াটিতে সংযুক্ত হবে
ক্রিস জনসন

63

আপনি এটি চেষ্টা করতে পারেন।

  1. আপনার উইন্ডোজ পরিষেবা তৈরি করুন এবং ইনস্টল করুন এবং শুরু করুন…। এটি হ'ল আপনার সিস্টেমে উইন্ডোজ পরিষেবাদি চলতে হবে।
  2. আপনার পরিষেবা চলমান চলাকালীন, ডিবাগ মেনুতে যান, সংযুক্তি প্রক্রিয়াটি ক্লিক করুন (বা পুরানো ভিজ্যুয়াল স্টুডিওতে প্রক্রিয়া)
  3. আপনার চলমান পরিষেবাটি সন্ধান করুন এবং তারপরে নিশ্চিত করুন সকল ব্যবহারকারীর কাছ থেকে প্রক্রিয়ার দেখান এবং সকল সেশান দেখান প্রসেস নির্বাচন করা হয়, তাহলে এটি নির্বাচন করা।

এখানে চিত্র বর্ণনা লিখুন

  1. সংযুক্তি বোতামটি ক্লিক করুন
  2. ঠিক আছে ক্লিক করুন
  3. বন্ধ ক্লিক করুন
  4. আপনার আকাঙ্ক্ষিত স্থানে একটি ব্রেক পয়েন্ট সেট করুন এবং সম্পাদনের জন্য অপেক্ষা করুন। যখনই আপনার কোডটি সেই বিন্দুতে পৌঁছায় এটি স্বয়ংক্রিয়ভাবে ডিবাগ হবে।
  5. মনে রাখবেন, আপনার ব্রেকপয়েন্টটি রাখুন পৌঁছনোযোগ্য স্থানে এটি যদি অন স্টার্ট () হয়, তবে বন্ধ করুন এবং পরিষেবাটি আবার শুরু করুন

(প্রচুর গুগল করার পরে, আমি এটি "ভিজ্যুয়াল স্টুডিওতে উইন্ডোজ পরিষেবাদিগুলি কীভাবে ডিবাগ করব" তে পেয়েছি))


4
ভিএস ২০১৩ আপডেটে এই অপশনটি দেখতে পাচ্ছেন না::
সন্দীপ তালাঠুল

4
তবে আপনাকে প্রশাসনিক হিসাবে আপনার
ভিএস -2017

4
আমি এই চেষ্টা করেছিলাম। এটি
অনস্টপে ব্রেকআপপয়েন্ট

22

আপনাকে যে সমস্ত কোড করবে তা আলাদা করে দেওয়া উচিত আলাদা প্রকল্পে সেবা প্রকল্প থেকে কাপড়, এবং তারপর একটি পরীক্ষা অ্যাপ্লিকেশন যা আপনাকে চালানো এবং ডিবাগ করতে স্বাভাবিকভাবে ভুলবেন না।

পরিষেবা প্রকল্পটি এর পরিষেবার অংশটি বাস্তবায়নের জন্য প্রয়োজনীয় শেল হবে।


বাহ !! ctrl + C এর পরে ctrl + V, মানে নতুন প্রকল্পের অর্থ i ইয়া যে কেবল আমিই করছি। পৃথক প্রকল্পের পরিবর্তে কোনও প্রক্রিয়া ডিবাগ করতে বা অন্য কোনও বিকল্প সংযুক্ত করা কি সম্ভব নয়?
পাভানএস

4
অবশ্যই এটি সম্ভব, তবে আপনি যদি বিকাশের সময় পরিষেবার অংশটি বের করেন তবে উইন্ডোজ পরিষেবাটি বিকাশ করা অনেক সহজ।
লাসে ভি কার্লসেন

হুমমম ... এটি ভাল উপায় তবে কেবল এটি দ্বিগুণ হয়। আমি ভেবেছিলাম অন্য কোনও উপায় থাকবে।
পাভানস

9
কাজটি কীভাবে "দ্বিগুণ" হবে তা আমি দেখছি না। অবশ্যই, এটি অতিরিক্ত প্রকল্প তৈরিতে এবং পরিষেবাটিতে কোডটিকে তৃতীয় প্রকল্পে আলাদা করার ক্ষেত্রে একটি সামান্য বিট যোগ করবে, তবে আপনি কোডটির একটি অনুলিপি তৈরি করবেন না, আপনি এটি সরিয়ে ফেলবেন, এবং প্রকল্পটি রেফারেন্স।
লাসে ভি কার্লসেন

4
^ + 1। এটি পরিষেবা পরিচালনায় কাজ দ্বিগুণ করে, যা বিকাশের সময়ের নিরিখে শূন্য এবং আপনি কেবল একবার এটি করেন do কোনও সেরিসের ডিবাগ করা পেনফুল - বরং কমান্ড লাইন হিসাবে দ্বৈত শুরু করুন। এটি করার অনুমতি দিয়ে পূর্বনির্ধারিত মোড়কের ক্লাসগুলির জন্য গুগল চেক করুন (তারা প্রতিস্থাপনটি ব্যবহার করে / কোনও তেহ পরিষেবা ক্লাস থামিয়ে দেয় না) sim এক ঘন্টা কাজ, প্রচুর সঞ্চয়, নেট ক্ষতি: নেতিবাচক - আপনি সময় অর্জন করেন।
টমটম

14

হয় লাসে ভি কার্লসেনের পরামর্শ অনুসারে বা আপনার সেবায় এমন একটি লুপ সেট আপ করুন যা কোনও ডিবাগার সংযুক্ত হওয়ার জন্য অপেক্ষা করবে। সবচেয়ে সহজ

while (!Debugger.IsAttached)
{
    Thread.Sleep(1000);
}

... continue with code

এইভাবে আপনি পরিষেবাটি শুরু করতে পারেন এবং ভিজ্যুয়াল স্টুডিওর অভ্যন্তরে আপনি "প্রক্রিয়াতে সংযুক্তি ..." চয়ন করেন এবং আপনার পরিষেবাতে সংযুক্ত করুন যা এরপরে স্বাভাবিক উত্তেজনা পুনরায় শুরু হবে।


উপরের কোডটি আমার কোথায় রাখা উচিত ... এবং সংযুক্তি প্রক্রিয়াতে আমি আমার পরিষেবাটি অক্ষম নামকরণ করে যাচ্ছি
পাভনএস

4
আমরা এর মতো if (Environment.UserInteractive) { InteractiveRun(args); } else { Service instance = new Service(); ServiceBase[] servicesToRun = new ServiceBase[] { instance }; ServiceBase.Run(servicesToRun); }
কোডও

যে কোনও কোডটি আপনি ডিবাগ করতে চান তা চালাতে সক্ষম হওয়ার আগে সেই কোডটি যত তাড়াতাড়ি সম্ভব হওয়া উচিত।
পাওলি Øস্টারø

@ পাওয়ান: ইন Start/ OnStart()আমার অনুমান
আবতিশ শেভ

@ কিরিল: মন্তব্যের অভ্যন্তরে কোডটি হাইলাইট করতে টিল্ডস ব্যবহার করুন, উদাহরণস্বরূপfoo(bar)
এ্যাব্যাটিশচেভ

7

ServiceBase.OnStartএর protectedদৃশ্যমানতা দেওয়া হয়েছে , আমি ডিবাগিংটি অর্জন করতে প্রতিবিম্বের পথে নামলাম।

private static void Main(string[] args)
{
    var serviceBases = new ServiceBase[] {new Service() /* ... */ };

#if DEBUG
    if (Environment.UserInteractive)
    {
        const BindingFlags bindingFlags =
            BindingFlags.Instance | BindingFlags.NonPublic;

        foreach (var serviceBase in serviceBases)
        {
            var serviceType = serviceBase.GetType();
            var methodInfo = serviceType.GetMethod("OnStart", bindingFlags);

            new Thread(service => methodInfo.Invoke(service, new object[] {args})).Start(serviceBase);
        }

        return;
    }
#endif

    ServiceBase.Run(serviceBases);
}

নোট করুন যে Thread, ডিফল্টরূপে, একটি অগ্রভাগ থ্রেড। returnথেকে ing Mainযখন ভুল-সার্ভিস থ্রেড দৌড়াচ্ছে প্রক্রিয়া বিনষ্ট করা হবে না।


যেহেতু অনস্টার্টটি দ্রুত ফিরে আসার কথা, তাই এটি অন্য থ্রেডে করার দরকার নেই। তবে, যদি পরিষেবাটি অন্য থ্রেড শুরু না করে, আপনার প্রক্রিয়াটি তত্ক্ষণাত্ প্রস্থান করবে।
ম্যাট কনলি

@ ম্যাটকননলি পরের দিকে: যদি প্রয়োজন হয় তবে আমি পূর্বের থ্রেডটি চিরকাল ঘুমায় (স্বাভাবিক প্রক্রিয়াজাতকরণের আগে) শুরু করতে আমি উপরের কোডটি পরিবর্তন করেছি।
ta.speot.is

এটি একটি আসল উত্তর হওয়া উচিত। সুন্দর কাজ করে!
lentai

4

একটি মাইক্রোসফ্ট নিবন্ধে এখানে একটি উইন্ডোজ পরিষেবা কীভাবে ডিবাগ করা যায় এবং যে কোনও প্রক্রিয়া সংযুক্ত করে এটি ডিবাগ করলে কোনও অংশ কী মিস করতে পারে তা ব্যাখ্যা করে।

নীচে আমার কাজের কোড দেওয়া আছে। আমি মাইক্রোসফ্ট দ্বারা প্রস্তাবিত পদ্ধতির অনুসরণ করেছি।

এই কোডটি এতে যুক্ত করুন program.cs:

static void Main(string[] args)
{
    // 'If' block will execute when launched through Visual Studio
    if (Environment.UserInteractive)
    {
        ServiceMonitor serviceRequest = new ServiceMonitor();
        serviceRequest.TestOnStartAndOnStop(args);
    }
    else // This block will execute when code is compiled as a Windows application
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new ServiceMonitor()
        };
        ServiceBase.Run(ServicesToRun);
    }
}

এই পরিষেবাটি সার্ভিস মনিটর শ্রেণিতে যুক্ত করুন।

internal void TestOnStartAndOnStop(string[] args)
{
    this.OnStart(args);
    Console.ReadLine();
    this.OnStop();
}

এখন প্রোজেক্ট প্রোপার্টিগুলিতে যান , ট্যাব "অ্যাপ্লিকেশন" নির্বাচন করুন এবং ডিবাগিংয়ের সময় "কনসোল অ্যাপ্লিকেশন" হিসাবে আউটপুট টাইপ নির্বাচন করুন বা আপনার পরিষেবাটি ডিবাগিং, পুনরায় কম্পাইল এবং ইনস্টল করার পরে "উইন্ডোজ অ্যাপ্লিকেশন" নির্বাচন করুন।

এখানে চিত্র বিবরণ লিখুন


4
মুক্তির জন্য ডিবাগ এবং উইন্ডো অ্যাপ্লিকেশনটিতে কনসোল অ্যাপ্লিকেশনটিতে আউটপুট সেট করার কোনও উপায় আছে কি?
কোফিফাস

3

আপনি একটি কনসোল অ্যাপ্লিকেশন করতে পারেন। আমি এই mainফাংশনটি ব্যবহার করি :

    static void Main(string[] args)
    {
        ImportFileService ws = new ImportFileService();
        ws.OnStart(args);
        while (true)
        {
            ConsoleKeyInfo key = System.Console.ReadKey();
            if (key.Key == ConsoleKey.Escape)
                break;
        }
        ws.OnStop();
    }

আমার ImportFileServiceক্লাসটি আমার উইন্ডোজ পরিষেবার অ্যাপ্লিকেশনটির মতো ঠিক যেমন উত্তরাধিকারী ( ServiceBase) ব্যতীত ।


এটি একই প্রকল্পে বা আমি এই কনসোল অ্যাপ্লিকেশনটির জন্য অন্য কোনও প্রকল্পে
পাভানএস

এটি একই ধরণের ক্লাসের সাথে 2 টি পৃথক প্রকল্প। আমার ক্ষেত্রে এটি কেবল ইম্পোর্টফায়ার সার্ভিস ক্লাসের ডুপ্লিকেট সহ একটি সহজ পরিষেবা। যখন আমি ডেভ / টেস্ট করতে চাই, আমি কনসোলাপ ব্যবহার করি এবং তারপরে অনুলিপি / পেস্ট করি। লাসে ভি কার্লসেনের মতো বলেছিলেন, এটি একটি ডিবাগ প্রোগ্রাম, সমস্ত যুক্তি (ব্যবসায়) একটি তৃতীয় প্রকল্পে রয়েছে।
কেররুবিন

হ্যাঁ, হয়। এ কারণেই আমি বলেছি "উত্তরাধিকারী ( ServiceBase) বাদে ।" কনসোল অ্যাপে ডিবাগ করা আমার পক্ষে সহজ মনে হয়েছে তবে এটি যদি সবাইকে বোঝায় না তবে আমি বুঝতে পারি।
কেরুবিন

3

আমি সার্ভিসপ্রসেস.হেলপার্স নামে একটি দুর্দান্ত নুগেট প্যাকেজ ব্যবহার করি।

এবং আমি উদ্ধৃতি ...

এটি সংযুক্ত ডিবাগার দিয়ে চলার সময় প্লে / স্টপ / বিরতি ইউআই তৈরি করে উইন্ডোজ পরিষেবাদি ডিবাগিংয়ে সহায়তা করে, তবে সার্ভিসটি উইন্ডোজ সার্ভার পরিবেশের দ্বারা ইনস্টল এবং চালানোর অনুমতি দেয়।

কোডের এক লাইনের সাথে এই সমস্ত।

http://windowsservicehelper.codeplex.com/

একবার আপনার ইনস্টল করা এবং তারযুক্ত তারে আপনার উইন্ডোজ পরিষেবা প্রকল্পটিকে স্টার্ট-আপ প্রকল্প হিসাবে সেট করুন এবং আপনার ডিবাগারটিতে শুরু ক্লিক করুন।


ভাগ করে নেওয়ার জন্য ধন্যবাদ! এটি ছিল এখন পর্যন্ত সরলতম সমাধান!
ওয়েলিংটন জেনেলি

2

আপনি System.Diagnostics.Debugger.Lanunch () ব্যবহার করে দেখতে পারেন পদ্ধতিটিও দেখতে পারেন। এটি ডিবাগার পয়েন্টারটিকে নির্দিষ্ট স্থানে নিয়ে যেতে সহায়তা করে এবং তারপরে আপনি কোডটি ডিবাগ করতে পারেন।

এই পদক্ষেপের আগে দয়া করে ভিজুয়াল স্টুডিও কমান্ড প্রম্পটের কমান্ড লাইনটি ব্যবহার করে আপনার পরিষেবাটি ইনস্টল করুন ex

তারপরে আপনার পরিষেবাটি নিয়ন্ত্রণ প্যানেল থেকে শুরু করুন -> প্রশাসনিক সরঞ্জাম -> কম্পিউটার পরিচালনা -> পরিষেবা এবং অ্যাপ্লিকেশন -> পরিষেবাদি -> আপনার পরিষেবার নাম


2

আমি এই কোডটি আমার সার্ভিস ক্লাসে স্রেফ যুক্ত করেছি যাতে আমি অপ্রত্যক্ষভাবে অনস্টার্টকে কল করতে পারি, অনস্পট এর অনুরূপ।

    public void MyOnStart(string[] args)
    {
        OnStart(args);
    }

2

আমি /Consoleভিজ্যুয়াল স্টুডিও প্রকল্পে প্যারামিটারটি ব্যবহার করছি ডিবাগস্টার্ট বিকল্পগুলিকমান্ড লাইন আর্গুমেন্ট :

public static class Program
{
    [STAThread]
    public static void Main(string[] args)
    {
         var runMode = args.Contains(@"/Console")
             ? WindowsService.RunMode.Console
             : WindowsService.RunMode.WindowsService;
         new WinodwsService().Run(runMode);
    }
}


public class WindowsService : ServiceBase
{
    public enum RunMode
    {
        Console,
        WindowsService
    }

    public void Run(RunMode runMode)
    {
        if (runMode.Equals(RunMode.Console))
        {
            this.StartService();
            Console.WriteLine("Press <ENTER> to stop service...");
            Console.ReadLine();

            this.StopService();
            Console.WriteLine("Press <ENTER> to exit.");
            Console.ReadLine();
        }
        else if (runMode.Equals(RunMode.WindowsService))
        {
            ServiceBase.Run(new[] { this });
        }
    }

    protected override void OnStart(string[] args)
    {
        StartService(args);
    }

    protected override void OnStop()
    {
        StopService();
    }

    /// <summary>
    /// Logic to Start Service
    /// Public accessibility for running as a console application in Visual Studio debugging experience
    /// </summary>
    public virtual void StartService(params string[] args){ ... }

    /// <summary>
    /// Logic to Stop Service
    /// Public accessibility for running as a console application in Visual Studio debugging experience
    /// </summary>
    public virtual void StopService() {....}
}

2

আমি এই প্রশ্নটি পেয়েছি, তবে আমি মনে করি একটি পরিষ্কার এবং সহজ উত্তর অনুপস্থিত।

আমি আমার ডিবাগারটি কোনও প্রক্রিয়াতে সংযুক্ত করতে চাই না, তবে আমি এখনও পরিষেবা OnStartএবং OnStopপদ্ধতিগুলিতে কল করতে সক্ষম হতে চাই । আমি এটি কনসোল অ্যাপ্লিকেশন হিসাবে চালিত করতে চাই যাতে এনএলগ থেকে কনসোলে তথ্য লগ করতে পারি ।

আমি এই উজ্জ্বল গাইড পেয়েছি যা এটি করে:

প্রকল্প পরিবর্তন করে শুরু Output typeকরতে Console Application

এখানে চিত্র বিবরণ লিখুন

Program.csএই মত দেখতে আপনার পরিবর্তন করুন :

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
        // Startup as service.
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new Service1()
        };

        if (Environment.UserInteractive)
        {
            RunInteractive(ServicesToRun);
        }
        else
        {
            ServiceBase.Run(ServicesToRun);
        }
    }
}

তারপরে ইন্টারেক্টিভ মোডে চলমান পরিষেবাদিগুলির জন্য নিম্নলিখিত পদ্ধতিটি যুক্ত করুন।

static void RunInteractive(ServiceBase[] servicesToRun)
{
    Console.WriteLine("Services running in interactive mode.");
    Console.WriteLine();

    MethodInfo onStartMethod = typeof(ServiceBase).GetMethod("OnStart",
        BindingFlags.Instance | BindingFlags.NonPublic);
    foreach (ServiceBase service in servicesToRun)
    {
        Console.Write("Starting {0}...", service.ServiceName);
        onStartMethod.Invoke(service, new object[] { new string[] { } });
        Console.Write("Started");
    }

    Console.WriteLine();
    Console.WriteLine();
    Console.WriteLine(
        "Press any key to stop the services and end the process...");
    Console.ReadKey();
    Console.WriteLine();

    MethodInfo onStopMethod = typeof(ServiceBase).GetMethod("OnStop",
        BindingFlags.Instance | BindingFlags.NonPublic);
    foreach (ServiceBase service in servicesToRun)
    {
        Console.Write("Stopping {0}...", service.ServiceName);
        onStopMethod.Invoke(service, null);
        Console.WriteLine("Stopped");
    }

    Console.WriteLine("All services stopped.");
    // Keep the console alive for a second to allow the user to see the message.
    Thread.Sleep(1000);
}

দুর্দান্ত কোড! সহজ, কার্যকর। +1 তবে ঠিক তত সহজ আমি এটিকে একটি ফর্ম অ্যাপ্লিকেশন তৈরি করেছি। আমি সত্যিই কনসোল অ্যাপ্লিকেশনগুলি ঘৃণা করি। এছাড়াও, প্রতিটি পরিষেবা ইভেন্টের জন্য আপনি সহজেই একটি ফর্ম বোতাম প্রয়োগ করতে পারেন।
রোল্যান্ড

1

দুর্ভাগ্যক্রমে, আপনি যদি উইন্ডোজ পরিষেবা অপারেশনের একেবারে শুরুতে কিছু ডিবাগ করার চেষ্টা করছেন, চলমান প্রক্রিয়াটিতে "সংযুক্তি" কাজ করবে না। আমি অনস্টার্ট প্রসেসডিয়রের মধ্যেই ডিবাগার.ব্রেইক () ব্যবহার করার চেষ্টা করেছি, তবে একটি 64-বিট, ভিজ্যুয়াল স্টুডিও 2010 সংকলিত অ্যাপ্লিকেশন সহ, ব্রেক কমান্ডটি কেবল এইরকম একটি ত্রুটি ছুঁড়েছে:

System error 1067 has occurred.

এই মুহুর্তে, আপনার এক্সিকিউটেবলের জন্য আপনার রেজিস্ট্রিতে আপনাকে একটি "ইমেজ ফাইল এক্সিকিউশন" বিকল্প সেট আপ করতে হবে। এটি সেট আপ করতে পাঁচ মিনিট সময় নেয় এবং এটি খুব ভালভাবে কাজ করে। এখানে একটি মাইক্রোসফ্ট নিবন্ধ এখানে বিশদ রয়েছে:

কীভাবে: ডিবাগারটি স্বয়ংক্রিয়ভাবে চালু করুন


1

ভিজ্যুয়াল স্টুডিওর নিজস্ব পোস্ট-বিল্ড ইভেন্ট কমান্ড লাইনটি ব্যবহার করে দেখুন

পোস্ট-বিল্ডে এটি যুক্ত করার চেষ্টা করুন:

@echo off
sc query "ServiceName" > nul
if errorlevel 1060 goto install
goto stop

:delete
echo delete
sc delete "ServiceName" > nul
echo %errorlevel%
goto install

:install
echo install
sc create "ServiceName" displayname= "Service Display Name" binpath= "$(TargetPath)" start= auto > nul
echo %errorlevel%
goto start

:start
echo start
sc start "ServiceName" > nul
echo %errorlevel%
goto end

:stop
echo stop
sc stop "ServiceName" > nul
echo %errorlevel%
goto delete

:end

তাহলে এর মত একটি বার্তা সঙ্গে বিল্ড ত্রুটি Error 1 The command "@echo off sc query "ServiceName" > nulইত্যাদি, Ctrl+ + Cতারপর Ctrl+ +V বার্তার শেষ বাক্য এ নোটপ্যাড মধ্যে ত্রুটি বার্তা ও চেহারা।

এটা বলতে পারে exited with code x। কিছু সাধারণ ত্রুটিতে কোডটি এখানে দেখুন এবং এটি কীভাবে সমাধান করবেন তা দেখুন।

1072 -- Marked for deletion → Close all applications that maybe using the service including services.msc and Windows event log.
1058 -- Can't be started because disabled or has no enabled associated devices → just delete it.
1060 -- Doesn't exist → just delete it.
1062 -- Has not been started → just delete it.
1053 -- Didn't respond to start or control → see event log (if logged to event log). It may be the service itself throwing an exception.
1056 -- Service is already running → stop the service, and then delete.

ত্রুটি কোড এখানে আরও

এবং যদি বার্তার মতো বিল্ড ত্রুটি হয়,

Error    11    Could not copy "obj\x86\Debug\ServiceName.exe" to "bin\Debug\ServiceName.exe". Exceeded retry count of 10. Failed.    ServiceName
Error    12    Unable to copy file "obj\x86\Debug\ServiceName.exe" to "bin\Debug\ServiceName.exe". The process cannot access the file 'bin\Debug\ServiceName.exe' because it is being used by another process.    ServiceName

সিএমডি খুলুন এবং তারপরে প্রথমে এটি হত্যা করার চেষ্টা করুন taskkill /fi "services eq ServiceName" /f

সবকিছু ঠিকঠাক থাকলে F5এটি ডিবাগ করার জন্য পর্যাপ্ত হওয়া উচিত।


0

ইন OnStartপদ্ধতি, নিচের কাজগুলো।

protected override void OnStart(string[] args)
{
    try
    {
        RequestAdditionalTime(600000);
        System.Diagnostics.Debugger.Launch(); // Put breakpoint here.

        .... Your code
    }
    catch (Exception ex)
    {
        .... Your exception code
    }
}

তারপরে প্রশাসক হিসাবে একটি কমান্ড প্রম্পট চালান এবং নিম্নলিখিতটিতে রাখুন:

c:\> sc create test-xyzService binPath= <ProjectPath>\bin\debug\service.exe type= own start= demand

উপরের লাইনটি পরিষেবার তালিকায় টেস্ট-জাইজ সার্ভিস তৈরি করবে।

পরিষেবাটি শুরু করতে, এটি আপনাকে ভিজ্যুয়াল স্টুডিওতে অভিষেকের অনুরোধ জানাবে বা না।

c:\> sc start text-xyzService

পরিষেবা বন্ধ করতে:

c:\> sc stop test-xyzService

মুছতে বা আনইনস্টল করতে:

c:\> sc delete text-xyzService

0

একটি উইন্ডোজ পরিষেবা পোস্টের মাধ্যমে ডিবাগ করুন (ভিএস 2015 আপডেট 3 এবং। নেট এফডাব্লু 4.6 দিয়ে পরীক্ষিত)

প্রথমত, আপনাকে আপনার ভিএস সলিউশন (অ্যাড -> নতুন প্রকল্প -> কনসোল অ্যাপ্লিকেশন) এর মধ্যে একটি কনসোল প্রকল্প তৈরি করতে হবে।

নতুন প্রকল্পের মধ্যে, সেই কোড সহ একটি ক্লাস "কনসোলহোস্ট" তৈরি করুন:

class ConsoleHost : IDisposable
{
    public static Uri BaseAddress = new Uri(http://localhost:8161/MyService/mex);
    private ServiceHost host;

    public void Start(Uri baseAddress)
    {
        if (host != null) return;

        host = new ServiceHost(typeof(MyService), baseAddress ?? BaseAddress);

        //binding
        var binding = new BasicHttpBinding()
        {
            Name = "MyService",
            MessageEncoding = WSMessageEncoding.Text,
            TextEncoding = Encoding.UTF8,
            MaxBufferPoolSize = 2147483647,
            MaxBufferSize = 2147483647,
            MaxReceivedMessageSize = 2147483647
        };

        host.Description.Endpoints.Clear();
        host.AddServiceEndpoint(typeof(IMyService), binding, baseAddress ?? BaseAddress);

        // Enable metadata publishing.
        var smb = new ServiceMetadataBehavior
        {
            HttpGetEnabled = true,
            MetadataExporter = { PolicyVersion = PolicyVersion.Policy15 },
        };

        host.Description.Behaviors.Add(smb);

        var defaultBehaviour = host.Description.Behaviors.OfType<ServiceDebugBehavior>().FirstOrDefault();
        if (defaultBehaviour != null)
        {
            defaultBehaviour.IncludeExceptionDetailInFaults = true;
        }

        host.Open();
    }

    public void Stop()
    {
        if (host == null)
            return;

        host.Close();
        host = null;
    }

    public void Dispose()
    {
        this.Stop();
    }
}

এবং এটি প্রোগ্রাম। কোড শ্রেণীর কোড:

public static class Program
{
    [STAThread]
    public static void Main(string[] args)
    {
        var baseAddress = new Uri(http://localhost:8161/MyService);
        var host = new ConsoleHost();
        host.Start(null);
        Console.WriteLine("The service is ready at {0}", baseAddress);
        Console.WriteLine("Press <Enter> to stop the service.");
        Console.ReadLine();
        host.Stop();
    }
}

কনসোলস্ট্রিংয়ের মতো কনফিগারেশনগুলি কনসোল প্রকল্পের App.config ফাইলটিতে অনুলিপি করা উচিত।

কনসোলটি উত্সাহিত করতে কনসোল প্রকল্পটিতে রি-ক্লিক করুন এবং ডিবাগ -> নতুন উদাহরণ শুরু করুন ক্লিক করুন।


0

আপনার পরিষেবা শ্রেণিতে কেবলমাত্র একজন ঠিকাদার যুক্ত করুন (যদি আপনার এটি ইতিমধ্যে না থাকে)। নীচে, আপনি চাক্ষুষ মৌলিক নেট জন্য উদাহরণ পরীক্ষা করতে পারেন।

Public Sub New()
   OnStart(Nothing) 
End Sub

এর পরে, প্রকল্পটিতে ডান ক্লিক করুন এবং " ডিবাগ -> একটি নতুন উদাহরণ শুরু করুন" নির্বাচন করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.