Cài đặt Windows Service được tạo trong Visual Studio


136

Khi tôi tạo một Dịch vụ Windows mới trong Visual Studio 2010, tôi nhận được thông báo cho biết sử dụng InstallUtil và net start để chạy dịch vụ.

Tôi đã thử các bước sau:

  1. Tạo dự án mới Tệp -> Mới -> Dự án -> Dịch vụ Windows
  2. Tên dự án: TestService
  3. Xây dựng dự án như hiện tại (constructor Service1, OnStart, OnStop)
  4. Mở dấu nhắc lệnh, chạy "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.exe" TestService.exe
  5. Chạy net bắt đầu TestService .

Đầu ra của bước 4

Chạy cài đặt giao dịch.

Bắt đầu giai đoạn Cài đặt cài đặt.

Xem nội dung của tệp nhật ký để biết tiến trình lắp ráp C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Project \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.

Tệp được đặt tại C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Project \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

Cài đặt lắp ráp 'C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Project \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'.

Các thông số bị ảnh hưởng là:

logtoconsole =

logfile = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Project \ TestService \ T estService \ obj \ x86 \ Debug \ TestService.InstallLog

assemblypath = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Project \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

Không có trình cài đặt công khai nào có thuộc tính RunInstallerAttribution.Yes trong tập hợp C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Project \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Giai đoạn Cài đặt hoàn tất thành công và giai đoạn Cam kết bắt đầu.

Xem nội dung của tệp nhật ký để biết tiến trình lắp ráp C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Project \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.

Tệp được đặt tại C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Project \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

Cam kết lắp ráp 'C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Project \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'.

Các thông số bị ảnh hưởng là:

logtoconsole =

logfile = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Project \ TestService \ T estService \ obj \ x86 \ Debug \ TestService.InstallLog

assemblypath = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Project \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

Không có trình cài đặt công khai nào có thuộc tính RunInstallerAttribution.Yes trong tập hợp C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Project \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Xóa tệp InstallState vì không có trình cài đặt.

Giai đoạn Cam kết hoàn thành thành công.

Cài đặt giao dịch đã hoàn thành.

Đầu ra của bước 5

Tên dịch vụ không hợp lệ.

Thêm trợ giúp có sẵn bằng cách gõ NET HELPMSG 2185.

Câu trả lời:


243

Bạn cần mở tệp Service.cs trong trình thiết kế, nhấp chuột phải vào tệp đó và chọn tùy chọn menu "Thêm trình cài đặt".

Nó sẽ không cài đặt ngay ra khỏi hộp ... trước tiên bạn cần tạo lớp trình cài đặt.

Một số tài liệu tham khảo về trình cài đặt dịch vụ:

Cách: Thêm trình cài đặt vào Ứng dụng dịch vụ của bạn

Khá cũ ... nhưng đây là những gì tôi đang nói về:

Dịch vụ Windows trong C #: Thêm Trình cài đặt (phần 3)

Bằng cách này, một ProjectInstaller.cstự động sẽ được tạo ra. Sau đó, bạn có thể nhấp đúp vào đây, nhập trình thiết kế và định cấu hình các thành phần:

  • serviceInstaller1có các thuộc tính của dịch vụ bản thân: Description, DisplayName, ServiceNameStartTypelà quan trọng nhất.

  • serviceProcessInstaller1có tài sản quan trọng này: Accountđó là tài khoản mà dịch vụ sẽ chạy.

Ví dụ:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;

3
Thêm trình cài đặt và thiết lập tài khoản cho LocalSystem đã làm điều đó. Cảm ơn!
Luc

1
Tôi đang nhận được cùng một lỗi trong VS2013. Tôi đã kiểm tra các liên kết bạn cung cấp, xác minh rằng tôi có ProjectInstaller, bao gồm cả dịch vụ thành phần [Process] Installer1, được cấu hình đúng. Tôi chạy installutil.exe với tư cách Quản trị viên. Nó vẫn báo cáo "Không có trình cài đặt công khai nào có thuộc tính RunInstallerAttribution.Yes". Có ý kiến ​​gì không?
Barry Dysert

4
Cười lớn. Tôi thích liên kết "Khá cũ" là đến một trang web có tên Arcane Code. Trang càng cũ, tên của người xác nhận càng trở thành :-)
HotN

"Nhà thiết kế" là gì? Các ứng dụng không có UI thường không liên quan đến bất kỳ thứ gì được gọi là nhà thiết kế.
Maxx

Các dịch vụ cũng có một nhà thiết kế, giống như các hình thức
Grungondola

11

Nhìn:

Không có trình cài đặt công khai nào có thuộc tính RunInstallerAttribution.Yes trong tập hợp C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Project \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Có vẻ như bạn có thể không có lớp trình cài đặt trong mã của mình. Đây là một lớp kế thừa từ Installerđó sẽ cho biết installutilcách cài đặt tệp thực thi của bạn như một dịch vụ.

Ps Tôi có mẫu Windows Service tự cài đặt / gỡ lỗi nhỏ của mình ở đây mà bạn có thể sao chép mã từ hoặc sử dụng: Gỡ lỗi, Tự cài đặt Dịch vụ Windows


Khi tôi nhấp chuột phải vào dự án TestService trong Visual Studio -> Thuộc tính -> Dịch vụ, trang bị vô hiệu hóa ... bạn có đang đề cập đến một vị trí khác không? Trong Ứng dụng, tên hội là TestService.
JKH

@ John: Bỏ qua phần đầu tiên về bảng điều khiển dịch vụ, hãy xem phần thứ hai bắt đầu với Trên thực tế . Có vẻ như dịch vụ không bao giờ được cài đặt vì nó không tìm thấy trình cài đặt.
James Michael Hare

8

Đây là một cách khác để làm cho trình cài đặt và thoát khỏi thông báo lỗi đó. Ngoài ra, có vẻ như VS2015 express không có mục menu "Thêm trình cài đặt".

Bạn chỉ cần tạo một lớp và thêm mã dưới đây và thêm System.Configuration.Install.dll tham chiếu.

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);
        }
    }
}

Chạy VS2015 cũng vậy và giải pháp này đã giúp tôi vượt qua thông báo lỗi "Không có trình cài đặt công khai với thông báo lỗi RunInstallerAttribution.Yes" mà tôi đã nhận được trước đây. Cảm ơn bạn!
PHBeagle

6

Hai vấn đề điển hình:

  1. Thiếu lớp ProjectInstaller (như @MiguelAngelo đã chỉ)
  2. Các dấu nhắc lệnh phải “Run as quản trị

4

Một vấn đề khác có thể xảy ra (mà tôi gặp phải):

Hãy chắc chắn rằng ProjectInstallerlớp học là public. Thành thật mà nói, tôi không chắc chính xác tôi đã làm như thế nào, nhưng tôi đã thêm các trình xử lý sự kiện vào ProjectInstaller.Designer.cs, như:

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

Tôi đoán trong quá trình tự động tạo hàm xử lý trong ProjectInstaller.csnó đã thay đổi định nghĩa lớp từ

public class ProjectInstaller : System.Configuration.Install.Installer

đến

partial class ProjectInstaller : System.Configuration.Install.Installer

thay thế các publictừ khóa với partial. Vì vậy, để khắc phục nó phải

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

Tôi sử dụng phiên bản Cộng đồng Visual Studio 2013.


Tôi biết điều này là 3 năm sau, nhưng điều này đã giải quyết vấn đề của tôi. Không chắc chắn tại sao hoặc khi nhà thiết kế thay đổi lớp một phần công khai trước đó thành lớp một phần nội bộ. Cảm ơn bạn!
thùng rác

2

Thay đổi lén lút trong VS 2010 và .NET 4.0 trở lên

Không tìm thấy trình cài đặt công khai nào có thuộc tính RunInstallerAttribution.Yes

Có một thay đổi bí danh hoặc dọn dẹp trình biên dịch trong .NET có thể tiết lộ điều chỉnh nhỏ này cho trường hợp cụ thể của bạn.

Nếu bạn có đoạn mã sau

RunInstaller(true)   // old alias  

Bạn có thể cần cập nhật nó lên

RunInstallerAttribute(true)  // new property spelling

Nó giống như một bí danh được thay đổi dưới vỏ bọc tại thời gian biên dịch hoặc tại thời gian chạy và bạn sẽ nhận được hành vi lỗi này. Thay đổi rõ ràng ở trên đối với RunInstallerAttribution (true) đã sửa nó trong tất cả các kịch bản cài đặt của chúng tôi trên tất cả các máy.

Sau khi bạn thêm trình cài đặt dự án hoặc dịch vụ, hãy kiểm tra phiên bản cũ của Run Runstallstall (true) và thay đổi nó thành RunInstallerAttribution mới (true)


Theo hiểu biết của tôi, bạn có thể bỏ qua hậu tố "Thuộc tính", tức là [RunInstaller (true)] và [RunInstallerAttribution (true)] giống nhau. Hãy thử nó với một thuộc tính khác, ví dụ [DebuggerStepThrough ()] và [DebuggerStepThroughAttribution ()] - cả hai sẽ hoạt động khi được áp dụng cho một lớp.
Matt

1

Một lưu ý khác mà tôi gặp phải: đảm bảo lớp dẫn xuất Trình cài đặt của bạn (thông thường ProjectInstaller) nằm ở đầu phân cấp không gian tên, tôi đã thử sử dụng một lớp công khai trong một lớp công khai khác, nhưng điều này dẫn đến cùng một lỗi cũ:

Không tìm thấy trình cài đặt công khai nào có thuộc tính RunInstallerAttribution.Yes

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.