Ketika saya membuat Layanan Windows baru di Visual Studio 2010, saya mendapatkan pesan yang menyatakan untuk menggunakan InstallUtil dan net start untuk menjalankan layanan.
Saya telah mencoba langkah-langkah berikut:
- Buat File proyek baru -> Baru -> Proyek -> Layanan Windows
- Nama Proyek: TestService
- Buat proyek apa adanya (konstruktor Service1, OnStart, OnStop)
- Buka command prompt, jalankan "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.exe" TestService.exe
- Jalankan TestService mulai bersih .
Hasil dari langkah 4
Menjalankan instalasi yang ditransaksikan.
Memulai fase penginstalan.
Lihat konten file log untuk kemajuan perakitan C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.
File ini terletak di C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.
Menginstal rakitan 'C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'.
Parameter yang terpengaruh adalah:
logtoconsole =
logfile = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ T estService \ obj \ x86 \ Debug \ TestService.InstallLog
assemblypath = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe
Tidak ada penginstal publik dengan atribut RunInstallerAttribute.Yes dapat ditemukan di rakitan C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.
Fase Instal berhasil diselesaikan, dan fase Komit dimulai.
Lihat konten file log untuk kemajuan perakitan C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.
File ini terletak di C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.
Melakukan rakitan 'C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'.
Parameter yang terpengaruh adalah:
logtoconsole =
logfile = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ T estService \ obj \ x86 \ Debug \ TestService.InstallLog
assemblypath = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe
Tidak ada penginstal publik dengan atribut RunInstallerAttribute.Yes dapat ditemukan di rakitan C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.
Hapus file InstallState karena tidak ada penginstal.
Fase Komit berhasil diselesaikan.
Penginstalan yang ditransaksikan telah selesai.
Hasil dari langkah 5
Nama layanan tidak valid.
Bantuan lebih lanjut tersedia dengan mengetik NET HELPMSG 2185.
Melihat ke:
Sepertinya Anda tidak memiliki kelas pemasang dalam kode Anda. Ini adalah kelas yang mewarisi
Installer
yang akan memberi tahuinstallutil
cara menginstal executable Anda sebagai layanan.Ps Saya memiliki template Windows Service kecil saya yang dapat diinstal sendiri / dapat di-debug di sini tempat Anda dapat menyalin kode dari atau menggunakan: Debuggable, Layanan Windows yang Dapat Diinstal Sendiri
sumber
Berikut adalah cara alternatif untuk membuat penginstal dan menghilangkan pesan kesalahan itu. Juga tampaknya VS2015 express tidak memiliki item menu "Add Installer".
Anda hanya perlu membuat kelas dan menambahkan kode di bawah ini dan menambahkan referensi System.Configuration.Install.dll.
using System.Configuration.Install; using System.ServiceProcess; using System.ComponentModel; namespace SAS { [RunInstaller(true)] public class MyProjectInstaller : Installer { private ServiceInstaller serviceInstaller1; private ServiceProcessInstaller processInstaller; public MyProjectInstaller() { // Instantiate installer for process and service. processInstaller = new ServiceProcessInstaller(); serviceInstaller1 = new ServiceInstaller(); // The service runs under the system account. processInstaller.Account = ServiceAccount.LocalSystem; // The service is started manually. serviceInstaller1.StartType = ServiceStartMode.Manual; // ServiceName must equal those on ServiceBase derived classes. serviceInstaller1.ServiceName = "SAS Service"; // Add installer to collection. Order is not important if more than one service. Installers.Add(serviceInstaller1); Installers.Add(processInstaller); } } }
sumber
Dua masalah umum:
sumber
Masalah lain yang mungkin (yang saya hadapi):
Pastikan bahwa
ProjectInstaller
kelasnya adalahpublic
. Sejujurnya, saya tidak yakin bagaimana tepatnya saya melakukannya, tetapi saya menambahkan penangan acara keProjectInstaller.Designer.cs
, seperti:this.serviceProcessInstaller1.BeforeInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_BeforeInstall);
Saya kira selama proses otomatis membuat fungsi handler di
ProjectInstaller.cs
dalamnya mengubah definisi kelas daripublic class ProjectInstaller : System.Configuration.Install.Installer
untuk
partial class ProjectInstaller : System.Configuration.Install.Installer
mengganti dengan
public
kata kunci denganpartial
. Jadi, untuk memperbaikinya itu haruspublic partial class ProjectInstaller : System.Configuration.Install.Installer
Saya menggunakan Visual Studio 2013 Community edition.
sumber
Stealth Change di VS 2010 dan .NET 4.0 dan Nanti
Tidak ada installer publik dengan atribut RunInstallerAttribute.Yes yang dapat ditemukan
Ada perubahan alias atau pembersihan kompiler di .NET yang dapat mengungkapkan perubahan kecil ini untuk kasus spesifik Anda.
Jika Anda memiliki kode berikut…
RunInstaller(true) // old alias
Anda mungkin perlu memperbaruinya menjadi
RunInstallerAttribute(true) // new property spelling
Ini seperti alias yang diubah di bawah sampul pada waktu kompilasi atau saat runtime dan Anda akan mendapatkan perilaku kesalahan ini. Perubahan eksplisit di atas ke RunInstallerAttribute (true) memperbaikinya di semua skenario pemasangan kami di semua mesin.
Setelah Anda menambahkan project atau service installer, periksa RunInstaller "lama" (true) dan ubah ke RunInstallerAttribute baru (true)
sumber
Namun tangkapan lain yang saya temui: pastikan kelas turunan Installer Anda (biasanya
ProjectInstaller
) berada di bagian atas hierarki namespace, saya mencoba menggunakan kelas publik dalam kelas publik lain, tetapi ini menghasilkan kesalahan lama yang sama:Tidak ada installer publik dengan atribut RunInstallerAttribute.Yes yang dapat ditemukan
sumber