Jadi kami telah membuat layanan windows untuk memasukkan data ke aplikasi klien kami dan semuanya berjalan dengan baik. Klien telah datang dengan permintaan konfigurasi yang menyenangkan yang membutuhkan dua contoh layanan ini yang berjalan di server yang sama dan dikonfigurasi untuk menunjuk ke database terpisah.
Sejauh ini saya belum bisa membuat ini terjadi dan berharap sesama anggota stackoverflow mungkin bisa memberikan beberapa petunjuk mengapa.
Setup saat ini:
Saya telah menyiapkan proyek yang berisi layanan windows, kami akan menyebutnya AppService mulai sekarang, dan file ProjectInstaller.cs yang menangani langkah-langkah instalasi khusus untuk mengatur nama layanan berdasarkan kunci di App.config seperti itu :
this.serviceInstaller1.ServiceName = Util.ServiceName;
this.serviceInstaller1.DisplayName = Util.ServiceName;
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
Dalam hal ini Util hanyalah kelas statis yang memuat nama layanan dari file konfigurasi.
Dari sini dan seterusnya, saya telah mencoba dua cara berbeda untuk memasang kedua layanan dan keduanya gagal dengan cara yang sama.
Cara pertama adalah dengan menginstal salinan pertama layanan, menyalin direktori yang diinstal dan menamainya, lalu menjalankan perintah berikut setelah memodifikasi konfigurasi aplikasi untuk mengubah nama layanan yang diinginkan:
InstallUtil.exe /i AppService.exe
Ketika itu tidak berhasil, saya mencoba membuat proyek penginstal kedua, mengedit file konfigurasi dan membangun penginstal kedua. Ketika saya menjalankan penginstal, itu berfungsi dengan baik tetapi layanan tidak muncul di services.msc jadi saya menjalankan perintah sebelumnya terhadap basis kode yang diinstal kedua.
Kedua kali saya menerima output berikut dari InstallUtil (hanya bagian yang relevan):
Menjalankan instalasi yang ditransaksikan.
Memulai tahap penginstalan.
Menginstal layanan Layanan Aplikasi Dua ... Layanan Aplikasi Layanan Dua telah berhasil diinstal. Membuat Layanan Aplikasi sumber EventLog Dua di Aplikasi log ...
Pengecualian terjadi selama fase Instal. System.NullReferenceException: Referensi objek tidak disetel ke turunan objek.
Fase Rollback penginstalan dimulai.
Mengembalikan log peristiwa ke keadaan sebelumnya untuk sumber App Service Two. Layanan Aplikasi Layanan Dua sedang dihapus dari sistem ... Layanan Aplikasi Layanan Dua berhasil dihapus dari sistem.
Fase Rollback berhasil diselesaikan.
Penginstalan yang ditransaksikan telah selesai. Instalasi gagal, dan rollback telah dilakukan.
Maaf untuk posting yang bertele-tele, ingin memastikan ada informasi yang cukup relevan. Bagian yang sejauh ini membuat saya bingung adalah menyatakan bahwa penginstalan layanan selesai dengan sukses dan hanya setelah itu pergi untuk membuat sumber EventLog yang NullReferenceException tampaknya dilemparkan. Jadi, jika ada yang tahu apa yang saya lakukan salah atau memiliki pendekatan yang lebih baik, itu akan sangat dihargai.
http://journalofasoftwaredev.wordpress.com/2008/07/16/multiple-instances-of-same-windows-service/
. Anda dapat memasukkan kode ke dalam penginstal untuk mendapatkan nama layanan yang Anda inginkan ketika Anda menjalankan installutil.Solusi ini berhasil untuk saya.
sumber
[path to your exe]
harus jalur penuh dan jangan lupa spasi setelahnyabinpath=
Anda dapat menjalankan beberapa versi dari layanan yang sama dengan melakukan hal berikut:
1) Salin Layanan yang dapat dieksekusi dan konfigurasikan ke foldernya sendiri.
2) Salin Install.Exe ke folder layanan yang dapat dieksekusi (dari folder framework .net)
3) Buat file konfigurasi bernama Install.exe.config di folder layanan yang dapat dieksekusi dengan konten berikut (nama layanan unik):
4) Buat file batch untuk menginstal layanan dengan konten berikut:
5) Saat Anda di sana, buat file batch uninstall
EDIT:
Perhatikan jika saya melewatkan sesuatu, berikut adalah Kelas ServiceInstaller (sesuaikan sesuai kebutuhan):
sumber
Pertanyaan lama, saya tahu, tapi saya beruntung menggunakan opsi / servicename di InstallUtil.exe. Saya tidak melihatnya tercantum dalam bantuan bawaan.
Saya tidak sepenuhnya yakin di mana saya pertama kali membaca tentang ini tetapi saya belum melihatnya sejak itu. YMMV.
sumber
An exception occurred during the Install phase. System.ComponentModel.Win32Exception: The specified service already exists
Cara cepat lain untuk menentukan nilai khusus untuk
ServiceName
danDisplayName
adalah menggunakaninstallutil
parameter baris perintah.Di
ProjectInstaller
kelas Anda, timpa metode virtualInstall(IDictionary stateSaver)
danUninstall(IDictionary savedState)
Instal layanan dengan
installutil
menambahkan nama kustom Anda menggunakan/servicename
parameter:Harap perhatikan bahwa jika Anda tidak menentukan
/servicename
di baris perintah, layanan akan diinstal dengan nilai ServiceName dan DisplayName yang ditentukan di properti / konfigurasi ProjectInstallersumber
Saya tidak terlalu beruntung dengan metode di atas ketika menggunakan perangkat lunak penyebaran otomatis kami untuk sering menginstal / menghapus layanan windows berdampingan, tetapi saya akhirnya menemukan yang berikut ini yang memungkinkan saya untuk memberikan parameter untuk menentukan sufiks ke nama layanan di baris perintah. Ini juga memungkinkan perancang berfungsi dengan baik dan dapat dengan mudah disesuaikan untuk mengganti seluruh nama jika perlu.
Dengan pemikiran ini, saya dapat melakukan hal berikut: Jika saya telah memanggil layanan "Layanan Luar Biasa" maka saya dapat menginstal versi UAT dari layanan tersebut sebagai berikut:
InstallUtil.exe /ServiceSuffix="UAT" MyService.exe
Ini akan membuat layanan dengan nama "Layanan Luar Biasa - UAT". Kami telah menggunakan ini untuk menjalankan versi DEVINT, PENGUJIAN, dan PENERIMAAN dari layanan yang sama yang berjalan berdampingan pada satu mesin. Setiap versi memiliki kumpulan file / konfigurasinya sendiri - Saya belum mencoba ini untuk menginstal beberapa layanan yang menunjuk ke kumpulan file yang sama.
CATATAN: Anda harus menggunakan
/ServiceSuffix
parameter yang sama untuk menghapus instalan layanan, jadi Anda akan menjalankan yang berikut ini untuk menghapus instalan:InstallUtil.exe /u /ServiceSuffix="UAT" MyService.exe
sumber
/ServiceSuffix="UAT"
digunakan oleh penginstal untuk menyetel sufiks pada layanan. Dalam contoh saya, nilai yang diteruskan adalahUAT
. Dalam skenario saya, saya hanya ingin menambahkan sufiks ke nama layanan yang ada, tetapi tidak ada alasan Anda tidak dapat menyesuaikan ini untuk mengganti nama sepenuhnya dengan nilai yang diteruskan.Apa yang telah saya lakukan untuk membuat ini berfungsi adalah menyimpan nama layanan dan nama tampilan di app.config untuk layanan saya. Kemudian di kelas installer saya, saya memuat app.config sebagai XmlDocument dan menggunakan xpath untuk mengeluarkan nilai dan menerapkannya ke ServiceInstaller.ServiceName dan ServiceInstaller.DisplayName, sebelum memanggil InitializeComponent (). Ini mengasumsikan Anda belum menyetel properti ini di InitializeComponent (), dalam hal ini, pengaturan dari file konfigurasi Anda akan diabaikan. Kode berikut adalah apa yang saya panggil dari konstruktor kelas penginstal saya, sebelum InitializeComponent ():
Saya tidak percaya membaca file konfigurasi langsung dari ConfigurationManager.AppSettings atau yang serupa akan berfungsi seperti ketika penginstal berjalan, itu berjalan dalam konteks InstallUtil.exe, bukan .exe layanan Anda. Anda mungkin dapat melakukan sesuatu dengan ConfigurationManager.OpenExeConfiguration, namun dalam kasus saya, ini tidak berfungsi karena saya mencoba masuk ke bagian konfigurasi kustom yang tidak dimuat.
sumber
Hanya untuk meningkatkan jawaban sempurna dari @ chris.house.00 ini , Anda dapat mempertimbangkan fungsi berikut untuk membaca dari pengaturan aplikasi Anda:
sumber
Saya memiliki situasi yang sama, di mana saya memerlukan layanan sebelumnya, dan layanan yang diperbarui berjalan berdampingan di server yang sama. (Itu lebih dari sekedar perubahan database, itu juga perubahan kode). Jadi saya tidak bisa menjalankan .exe yang sama dua kali. Saya membutuhkan .exe baru yang dikompilasi dengan DLL baru tetapi dari proyek yang sama. Hanya mengubah nama layanan dan nama tampilan layanan tidak berhasil untuk saya, saya masih menerima "kesalahan layanan sudah ada" yang saya yakini karena saya menggunakan Proyek Penerapan. Apa yang akhirnya berhasil untuk saya adalah di dalam Properti Proyek Penerapan saya, ada properti bernama "Kode Produk" yang merupakan Panduan.
Setelah itu, membangun kembali Proyek Penataan ke .exe atau .msi baru berhasil diinstal.
sumber
Pendekatan paling sederhana didasarkan pada nama layanan pada nama dll:
sumber