Saya memiliki aplikasi konsol dan ingin menjalankannya sebagai layanan Windows. VS2010 memiliki templat proyek yang memungkinkan untuk melampirkan proyek konsol dan membangun layanan Windows. Saya ingin tidak menambahkan proyek layanan yang terpisah dan jika mungkin mengintegrasikan kode layanan ke dalam aplikasi konsol untuk menjaga aplikasi konsol sebagai satu proyek yang dapat berjalan sebagai aplikasi konsol atau sebagai layanan windows jika dijalankan misalnya dari baris perintah menggunakan sakelar.
Mungkin seseorang dapat menyarankan perpustakaan kelas atau potongan kode yang dapat dengan cepat dan mudah mengubah aplikasi c # console ke layanan?
Jawaban:
Saya biasanya menggunakan techinque berikut untuk menjalankan aplikasi yang sama dengan aplikasi konsol atau sebagai layanan:
Environment.UserInteractive
biasanya berlaku untuk aplikasi konsol dan palsu untuk layanan. Secara teknis, dimungkinkan untuk menjalankan layanan dalam mode interaktif-pengguna, sehingga Anda dapat memeriksa sakelar baris perintah sebagai gantinya.sumber
Saya sudah sukses besar dengan TopShelf .
TopShelf adalah paket Nuget yang dirancang untuk membuatnya mudah untuk membuat aplikasi .NET Windows yang dapat berjalan sebagai aplikasi konsol atau sebagai Layanan Windows. Anda dapat dengan cepat menghubungkan peristiwa seperti layanan Anda Memulai dan Menghentikan acara, mengonfigurasi menggunakan kode misalnya untuk mengatur akun berjalan, mengonfigurasi dependensi pada layanan lain, dan mengonfigurasi cara pemulihan dari kesalahan.
Dari Package Manager Console (Nuget):
Lihat contoh kode untuk memulai.
Contoh:
TopShelf juga menangani pemasangan layanan, yang dapat menghemat banyak waktu dan menghapus kode boilerplate dari solusi Anda. Untuk menginstal .exe Anda sebagai layanan, Anda cukup menjalankan yang berikut dari command prompt:
Anda tidak perlu menghubungkan ServiceInstaller dan semua itu - TopShelf melakukan semuanya untuk Anda.
sumber
Jadi, inilah langkah-langkah lengkapnya:
* InstallUtil.exe biasanya dapat ditemukan di sini: C: \ windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.ex e
Program.cs
MyService.cs
MyServiceInstaller.cs
sumber
Saya mendengar maksud Anda menginginkan satu majelis untuk menghentikan kode berulang tetapi, Akan lebih sederhana dan mengurangi pengulangan kode dan membuatnya lebih mudah untuk menggunakan kembali kode Anda dengan cara lain di masa depan jika ...... Anda memecahnya menjadi 3 majelis.
sumber
Start()
danStop()
metode dan aplikasi konsol memiliki loop. Pendek menggunakan kerangka kerja seperti TopShelf , ini adalah pilihan terbaikBerikut adalah cara yang lebih baru tentang cara mengubah Aplikasi Konsol ke Layanan Windows sebagai Layanan Pekerja berdasarkan .Net Core 3.1 terbaru .
Jika Anda membuat Layanan Pekerja dari Visual Studio 2019 itu akan memberi Anda hampir semua yang Anda butuhkan untuk membuat Layanan Windows di luar kotak, yang juga merupakan apa yang Anda perlu ubah ke aplikasi konsol untuk mengubahnya menjadi Layanan Windows.
Berikut adalah perubahan yang perlu Anda lakukan:
Instal paket NuGet berikut
Ubah Program.cs untuk memiliki implementasi seperti di bawah ini:
dan tambahkan Worker.cs di mana Anda akan meletakkan kode yang akan dijalankan oleh operasi layanan:
Ketika semuanya sudah siap, dan aplikasi telah berhasil dibangun, Anda dapat menggunakan sc.exe untuk menginstal exe aplikasi konsol Anda sebagai Layanan Windows dengan perintah berikut:
sumber
Kamu bisa memakai
Dan itu akan muncul di daftar layanan. Saya tidak tahu, apakah itu berfungsi dengan baik. Suatu layanan biasanya harus mendengarkan beberapa acara.
Ada beberapa pembungkus layanan, yang dapat menjalankan aplikasi apa pun sebagai layanan nyata. Sebagai Contoh, Microsoft SrvAny dari Win2003 Resource Kit
sumber
Pertama saya menanamkan solusi aplikasi konsol ke dalam solusi layanan windows dan referensi itu.
Kemudian saya membuat aplikasi Program konsol kelas untuk umum
Saya kemudian membuat dua fungsi di dalam aplikasi konsol
Kemudian di dalam layanan windows itu sendiri saya instantiate Program dan memanggil fungsi Mulai dan Berhenti ditambahkan dalam OnStart dan OnStop. Lihat di bawah
Pendekatan ini juga dapat digunakan untuk aplikasi windows / windows service hybrid
sumber
Mungkin Anda harus mendefinisikan apa yang Anda butuhkan, sejauh yang saya tahu, Anda tidak dapat menjalankan aplikasi Anda sebagai Konsol atau Layanan dengan baris perintah, pada saat yang sama. Ingat bahwa layanan ini diinstal dan Anda harus memulainya di Manajer Layanan, Anda dapat membuat aplikasi baru yang memulai layanan atau memulai proses baru menjalankan aplikasi konsol Anda. Tetapi ketika Anda menulis
Suatu ketika, saya berada di posisi Anda, mengubah aplikasi konsol menjadi layanan. Pertama, Anda perlu templat, jika Anda bekerja dengan VS Express Edition. Berikut ini tautan tempat Anda dapat memiliki langkah pertama: C # Layanan Windows , ini sangat membantu bagi saya. Kemudian menggunakan templat itu, tambahkan kode Anda ke acara layanan yang diinginkan.
Untuk meningkatkan layanan Anda, ada hal lain yang dapat Anda lakukan, tetapi ini tidak cepat dan / atau mudah, menggunakan appdomains, dan membuat dll untuk memuat / membongkar. Dalam satu Anda dapat memulai proses baru dengan aplikasi konsol, dan di lain lain Anda hanya dapat menempatkan fungsi layanan yang harus dilakukan.
Semoga berhasil.
sumber
Anda perlu memisahkan fungsi menjadi kelas atau kelas dan meluncurkannya melalui salah satu dari dua bertopik. Potongan rintisan konsol atau potongan layanan.
Seperti terlihat jelas, ketika menjalankan windows, berbagai layanan yang membentuk infrastruktur tidak (dan tidak bisa langsung) menghadirkan jendela konsol kepada pengguna. Layanan perlu berkomunikasi dengan pengguna dengan cara yang tidak grafis: melalui SCM; dalam event log, ke beberapa file log dll. Layanan ini juga perlu berkomunikasi dengan windows melalui SCM, jika tidak maka akan mendapatkan shutdown.
Jelas akan dapat diterima untuk memiliki beberapa aplikasi konsol yang dapat berkomunikasi dengan layanan tetapi layanan harus berjalan secara mandiri tanpa persyaratan untuk interaksi GUI.
Rintisan konsol dapat sangat berguna untuk men-debug perilaku layanan tetapi tidak boleh digunakan dalam lingkungan "produksi" yang, setelah semua, adalah tujuan membuat layanan.
Saya belum membacanya secara penuh tetapi artikel ini sepertinya membanjiri arah yang benar.
sumber
Saya menggunakan kelas layanan yang mengikuti pola standar yang ditentukan oleh
ServiceBase
, dan memakukan pembantu untuk memudahkan debugging F5. Ini membuat data layanan didefinisikan dalam layanan, membuatnya mudah ditemukan dan masa hidupnya mudah dikelola.Saya biasanya membuat aplikasi Windows dengan struktur di bawah ini. Saya tidak membuat aplikasi konsol; dengan cara itu saya tidak mendapatkan kotak hitam besar muncul di wajah saya setiap kali saya menjalankan aplikasi. Saya tinggal di debugger di mana semua tindakan. Saya menggunakan
Debug.WriteLine
sehingga pesan pergi ke jendela output, yang berlabuh dengan baik dan tetap terlihat setelah aplikasi berakhir.Saya biasanya tidak repot menambahkan kode debug untuk berhenti; Saya hanya menggunakan debugger saja. Jika saya perlu menghentikan debug, saya membuat proyek aplikasi konsol, menambahkan
Stop
metode penerusan, dan memanggilnya setelah panggilan keConsole.ReadKey
.sumber