Instal Layanan Windows yang dibuat di Visual Studio

139

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:

  1. Buat File proyek baru -> Baru -> Proyek -> Layanan Windows
  2. Nama Proyek: TestService
  3. Buat proyek apa adanya (konstruktor Service1, OnStart, OnStop)
  4. Buka command prompt, jalankan "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.exe" TestService.exe
  5. 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.

jkh
sumber

Jawaban:

246

Anda perlu membuka file Service.cs di designer, klik kanan dan pilih menu-option "Add Installer".

Itu tidak akan menginstal langsung dari kotak ... Anda perlu membuat kelas penginstal terlebih dahulu.

Beberapa referensi tentang penginstal layanan:

Cara: Menambahkan Pemasang ke Aplikasi Layanan Anda

Cukup tua ... tapi inilah yang saya bicarakan:

Layanan Windows di C #: Menambahkan Installer (bagian 3)

Dengan melakukan ini, a ProjectInstaller.csakan dibuat secara otomatis. Kemudian Anda dapat mengklik dua kali ini, masuk ke desainer, dan mengkonfigurasi komponen:

  • serviceInstaller1memiliki sifat-sifat dari layanan itu sendiri: Description, DisplayName, ServiceNamedan StartTypeyang paling penting.

  • serviceProcessInstaller1memiliki properti penting ini: Accountyaitu akun tempat layanan akan dijalankan.

Sebagai contoh:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
Miguel Angelo
sumber
3
Menambahkan penginstal dan mengatur akun ke LocalSystem berhasil. Terima kasih!
Luc
1
Saya mendapatkan kesalahan yang sama di VS2013. Saya memeriksa tautan yang Anda berikan, memverifikasi bahwa saya memiliki ProjectInstaller, termasuk layanan komponen [Proses] Installer1, yang dikonfigurasi dengan benar. Saya menjalankan installutil.exe sebagai Administrator. Ini masih melaporkan "Tidak ada pemasang publik dengan atribut RunInstallerAttribute.Yes dapat ditemukan". Ada ide?
Barry Dysert
4
Lol. Saya suka bahwa tautan "Cukup lama" adalah ke situs bernama Arcane Code. Semakin tua halaman itu, semakin benar namanya menjadi :-)
HotN
Apa itu "desainer"? Aplikasi yang tidak memiliki UI umumnya tidak melibatkan apa pun yang disebut desainer.
Maxx
Layanan juga memiliki desainer, seperti bentuk
Grungondola
12

Melihat ke:

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.

Sepertinya Anda tidak memiliki kelas pemasang dalam kode Anda. Ini adalah kelas yang mewarisi Installeryang akan memberi tahu installutilcara 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

James Michael Hare
sumber
Ketika saya mengklik kanan proyek TestService di Visual Studio -> Properties -> Services, halaman dinonaktifkan ... apakah Anda mengacu ke lokasi yang berbeda? Di bawah Application, nama Assembly adalah TestService.
jkh
@ John: Abaikan bagian pertama tentang konsol layanan, lihat bagian kedua yang dimulai dengan Sebenarnya . Sepertinya layanan tidak pernah dipasang karena tidak menemukan pemasang.
James Michael Hare
8

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);
        }
    }
}
Carol
sumber
Menjalankan VS2015 juga dan solusi ini membuat saya melewati pesan kesalahan "Tidak ada penginstal publik dengan RunInstallerAttribute.Yes" yang sebelumnya saya dapatkan. Terima kasih!
PHBeagle
7

Dua masalah umum:

  1. Hilang kelas ProjectInstaller (seperti yang ditunjukkan @MiguelAngelo)
  2. The command prompt keharusan “Run as Administrator
fabriciorissetto.dll
sumber
4

Masalah lain yang mungkin (yang saya hadapi):

Pastikan bahwa ProjectInstallerkelasnya adalah public. Sejujurnya, saya tidak yakin bagaimana tepatnya saya melakukannya, tetapi saya menambahkan penangan acara ke ProjectInstaller.Designer.cs, seperti:

this.serviceProcessInstaller1.BeforeInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_BeforeInstall);

Saya kira selama proses otomatis membuat fungsi handler di ProjectInstaller.csdalamnya mengubah definisi kelas dari

public class ProjectInstaller : System.Configuration.Install.Installer

untuk

partial class ProjectInstaller : System.Configuration.Install.Installer

mengganti dengan publickata kunci dengan partial. Jadi, untuk memperbaikinya itu harus

public partial class ProjectInstaller : System.Configuration.Install.Installer

Saya menggunakan Visual Studio 2013 Community edition.

John Archer
sumber
Saya tahu ini 3 tahun kemudian, tetapi ini menyelesaikan masalah saya. Tidak yakin mengapa atau kapan desainer mengubah kelas parsial publik sebelumnya ke kelas parsial internal. Terima kasih!
tukang sampah
2

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)

Sql Surfer
sumber
Sesuai pengetahuan saya, Anda dapat menghilangkan postfix "Attribute", yaitu [RunInstaller (true)] dan [RunInstallerAttribute (true)] adalah sama. Cobalah dengan atribut yang berbeda, misalnya [DebuggerStepThrough ()] dan [DebuggerStepThroughAttribute ()] - keduanya akan berfungsi saat diterapkan ke kelas.
Matt
1

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