Thiết lập đổi mới cho dịch vụ Windows?


105

Tôi có một dịch vụ .Net Windows. Tôi muốn tạo một trình cài đặt để cài đặt dịch vụ windows đó.

Về cơ bản, nó phải làm như sau:

  1. Đóng gói installutil.exe(Có bắt buộc không?)
  2. Chạy installutil.exeMyService.exe
  3. Khởi động MyService

Ngoài ra, tôi muốn cung cấp một trình gỡ cài đặt chạy lệnh sau:

installutil.exe /u MyService.exe

Làm thế nào để thực hiện những điều này bằng cách sử dụng Inno Setup?


Tôi nghĩ bạn cần sử dụng phần [Chạy]. Xem tại đây
Tăng đoàn vào

Câu trả lời:


233

Bạn không cần installutil.exevà có thể bạn thậm chí không có quyền phân phối lại nó.

Đây là cách tôi đang làm trong ứng dụng của mình:

using System;
using System.Collections.Generic;
using System.Configuration.Install; 
using System.IO;
using System.Linq;
using System.Reflection; 
using System.ServiceProcess;
using System.Text;

static void Main(string[] args)
{
    if (System.Environment.UserInteractive)
    {
        string parameter = string.Concat(args);
        switch (parameter)
        {
            case "--install":
                ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });
                break;
            case "--uninstall":
                ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });
                break;
        }
    }
    else
    {
        ServiceBase.Run(new WindowsService());
    }
}

Về cơ bản, bạn có thể yêu cầu dịch vụ của mình tự cài đặt / gỡ cài đặt bằng cách sử dụng ManagedInstallerClassnhư trong ví dụ của tôi.

Sau đó, chỉ cần thêm vào tập lệnh InnoSetup của bạn một cái gì đó như sau:

[Run]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--install"

[UninstallRun]
Filename: "{app}\MYSERVICE.EXE"; Parameters: "--uninstall"

3
bạn có thể thử Filename: "net.exe"; Parameters: "start WinServ". nếu nó không hoạt động, bạn chỉ có thể thêm một công tắc nữa - bắt đầu vào ứng dụng c # của bạn và bắt đầu dịch vụ windows trực tiếp từ chương trình bằng cách sử dụng lớp ServiceController ( msdn.microsoft.com/en-us/library/… ).
lubos hasko


7
Đối với tân sinh C # (như tôi), bạn cần thêm using System.Reflection;hoặc thay đổi Assemblythành System.Reflection.Assemblytrong đoạn mã trên.
rlandster

1
InstallUtil là một phần của khuôn khổ dot net, bạn không cần phải "quyền" để phân phối lại nó, nó có mặt trên hệ thống mục tiêu của bạn đã (giả sử bạn có thể chạy ứng dụng của bạn ở nơi đầu tiên dĩ nhiên)
Andrew Savinykh

10
Từ tài liệu về phương thức InstallHelper trong 4.5 - "API này hỗ trợ cơ sở hạ tầng .NET Framework và không nhằm mục đích sử dụng trực tiếp từ mã của bạn." Được phát hiện sau khi nhận System.InvalidOperationException.
Bratch

8

Đây là cách tôi đã làm điều đó:

Exec(ExpandConstant('{dotnet40}\InstallUtil.exe'), ServiceLocation, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);

Rõ ràng, thiết lập Inno có các hằng số sau để tham chiếu đến thư mục .NET trên hệ thống của bạn:

  • {dotnet11}
  • {dotnet20}
  • {dotnet2032}
  • {dotnet2064}
  • {dotnet40}
  • {dotnet4032}
  • {dotnet4064}

Thông tin thêm có sẵn tại đây .


5

Bạn có thể dùng

Exec(
    ExpandConstant('{sys}\sc.exe'),
    ExpandConstant('create "MyService" binPath= {app}\MyService.exe start= auto DisplayName= "My Service" obj= LocalSystem'), 
    '', 
    SW_HIDE, 
    ewWaitUntilTerminated, 
    ResultCode
    )

để tạo một dịch vụ. Xem " sc.exe " về cách bắt đầu, dừng, kiểm tra trạng thái dịch vụ, xóa dịch vụ, v.v.


2

Nếu bạn muốn tránh khởi động lại khi người dùng nâng cấp thì bạn cần phải dừng dịch vụ trước khi sao chép exe và bắt đầu lại sau đó.

Có một số chức năng tập lệnh để thực hiện việc này tại Dịch vụ - Các chức năng Bắt đầu, Dừng, Cài đặt, Loại bỏ Dịch vụ


Trong bài viết được liên kết của bạn, nguyên mẫu của các hàm được sử dụng không được dịch chính xác và cách sử dụng của chúng cũng không đúng (chẳng hạn như không đợi dịch vụ bắt đầu, dừng lại, v.v.).
TLama
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.