Saya memiliki layanan .NET windows standar yang ditulis dalam C #.
Bisakah itu menginstal sendiri tanpa menggunakan InstallUtil? Haruskah saya menggunakan kelas pemasang layanan? Bagaimana saya harus menggunakannya?
Saya ingin dapat memanggil yang berikut ini:
MyService.exe -install
Dan itu akan memiliki efek yang sama dengan memanggil:
InstallUtil MyService.exe
c#
.net
deployment
windows-services
installutil
Yuval Peled
sumber
sumber
Jawaban:
Ya, itu sepenuhnya mungkin (yaitu saya melakukan ini dengan tepat); Anda hanya perlu referensi dll yang tepat (System.ServiceProcess.dll) dan menambahkan kelas installer ...
Ini sebuah contoh:
sumber
static void Install(bool undo, string[] args)
luar definisi kelas (dll). Bisakah Anda mengklarifikasi bagaimana Anda menerapkan ini?Lihatlah metode InstallHelper dari kelas ManagedInstaller . Anda dapat menginstal layanan menggunakan:
Inilah yang dilakukan oleh InstallUtil. Argumennya sama dengan untuk InstallUtil.
Manfaat dari metode ini adalah tidak melibatkan messing di registri, dan menggunakan mekanisme yang sama seperti InstallUtil.
sumber
InstallUtil
3. Anda tidak perlu mengubah installer ketika pada x86 / x64 4. itu belum berubah dalam beberapa versi. Net - jika itu benar , itu akan diambil dalam pengujian dan saya akan memperbaikinya kemudian.Anda selalu dapat kembali ke panggilan WinAPI lama yang baik, meskipun jumlah pekerjaan yang terlibat tidak sepele. Tidak ada persyaratan bahwa layanan .NET diinstal melalui mekanisme .NET-aware.
Untuk memasang:
OpenSCManager
.CreateService
untuk mendaftarkan layanan.ChangeServiceConfig2
untuk menetapkan deskripsi.CloseServiceHandle
.Untuk menghapus instalasi:
OpenSCManager
.OpenService
.DeleteService
gagang yang dikembalikan olehOpenService
.CloseServiceHandle
.Alasan utama saya lebih suka ini daripada menggunakan
ServiceInstaller
/ServiceProcessInstaller
adalah bahwa Anda dapat mendaftarkan layanan dengan argumen baris perintah kustom Anda sendiri. Misalnya, Anda dapat mendaftarkannya sebagai"MyApp.exe -service"
, maka jika pengguna menjalankan aplikasi Anda tanpa argumen apa pun, Anda dapat menawarkan UI untuk menginstal / menghapus layanan.Menjalankan Reflector on
ServiceInstaller
dapat mengisi detail yang hilang dari penjelasan singkat ini.PS Jelas ini tidak akan memiliki "efek yang sama dengan memanggil: InstallUtil MyService.exe" - khususnya, Anda tidak akan dapat menghapus instalasi menggunakan InstallUtil. Tetapi tampaknya mungkin ini bukan persyaratan ketat yang sebenarnya untuk Anda.
sumber
Ini adalah kelas yang saya gunakan saat menulis layanan. Saya biasanya memiliki layar interaktif yang muncul ketika layanan tidak dipanggil. Dari sana saya menggunakan kelas sesuai kebutuhan. Hal ini memungkinkan untuk beberapa instance bernama pada mesin yang sama - karenanya bidang InstanceID
Contoh Panggilan
Kelas itu sendiri
sumber
GetCurrentProcess
bagian dengan parameter dan menggunakannya dengan sukses. bekerja hebat!Contoh di atas tidak benar-benar bekerja untuk saya, dan tautan ke forum sebagai solusi nomor 1 mengerikan untuk digali. Ini adalah kelas yang saya tulis (sebagian), dan bit lainnya digabungkan dari tautan ini yang saya temukan terkubur di suatu tempat
Untuk menginstal layanan, jalankan perintah InstallAndStart sebagai berikut:
Pastikan akun yang menjalankan program memiliki izin untuk menginstal layanan. Anda selalu dapat 'Jalankan Sebagai Administrator' pada program.
Saya juga menyertakan beberapa perintah untuk akses non-api yang tidak menginstal atau menghapus layanan, tetapi Anda dapat mencantumkannya dan mengontrol beberapa (mulai, berhenti, mulai ulang). Anda benar-benar hanya perlu meninggikan izin untuk menginstal atau menghapus layanan.
Ada beberapa perintah untuk mendapatkan dan mengatur variabel lingkungan juga, seperti
OPENSSL_CONF
atauTEMP
. Untuk sebagian besar, parameter dan nama metode harus cukup jelas.sumber
Unknown = -1, NotFound = 0, Stopped = 1, StartPending = 2, StopPending = 3, Running = 4
Dalam hal mencoba menginstal aplikasi baris perintah sebagai layanan Windows coba utilitas ' NSSM '. Detail ServerFault terkait ditemukan di sini .
sumber
sumber