2012-07-03 45 views
5

Tôi muốn tạo thiết lập cho dịch vụ windows của mình. Các dll của dịch vụ cửa sổ của tôi được đặt trong/Lib/thư mục.Cài đặt dịch vụ cửa sổ .net với thư mục lib

Tôi đã thêm lớp trình cài đặt vào dịch vụ. Và thêm hành động tùy chỉnh vào dự án thiết lập.

Vấn đề là khi tôi cố gắng để cài đặt các dịch vụ - nó không thành công với các lỗi: Lỗi 1001. Không thể để có được các loại cài đặt trong ...

Lỗi này xảy ra vì dlls không nằm trong cùng thư mục như dịch vụ .exe. Tôi đang sử dụng thăm dò trong cấu hình dịch vụ và cài đặt util không nhận ra rằng thăm dò ..

Tôi muốn tìm một công việc xung quanh cho vấn đề đó và thử nhiều cách để tạo ra dịch vụ sử dụng bộ điều khiển dịch vụ (sc. exe). Đang cố gắng chạy nó như là một hành động tùy chỉnh bằng cách sử dụng cmd.exe. Vv ..

Đây phải là vấn đề phổ biến..không ai tìm được giải pháp thích hợp cho điều đó?

Trả lời

0

Bạn nên liên kết với sự kiện AppDomain.AssemblyResolve và thực hiện tải tùy chỉnh của mình trong trình xử lý sự kiện.

Có thể tìm thấy mẫu trong câu trả lời đầu tiên cho this SO question.

+0

Hiện nay tôi đang chỉ sử dụng cấu hình ràng buộc .. Thats lý do tại sao cài đặt util không nhận ra dlls .. Dịch vụ này không chạy khi tôi sử dụng Sc.exe .. Nó chỉ không chạy bằng installutil, – Lee

+0

@Lior: Tôi vừa mới phục hồi câu trả lời của mình vì tôi nghĩ nó sẽ hoạt động. InstallUtil sẽ phải tải assembly của bạn trong CLR, tại thời điểm đó sự kiện 'AppDomain.AssemblyResolve' sẽ được nâng lên cho tất cả các phụ thuộc của bạn. Vui lòng thử. Nó có ý nghĩa (ít nhất là đối với tôi). –

0

trong cấu hình của bạn, bạn có thể thêm thăm dò đường - đó là một gợi ý để thời gian chạy nơi để tìm kiếm một lắp ráp http://msdn.microsoft.com/en-us/library/823z9h8w%28v=vs.80%29.aspx

+0

Tôi đang sử dụng thăm dò. Cài đặt util không đọc cấu hình, tôi đã nói điều này. – Lee

2

Tôi đã có cùng một vấn đề, và không ai trong số các tùy chọn gợi ý trong bài viết này hoặc MSDN đã giúp. Tôi tìm một giải pháp:

Bằng cách sử dụng Reflector trên InstallUtil.exe, tôi phát hiện ra rằng InstallUtil chỉ đơn thuần là một wrapper mỏng để gọi System.Configuration.Install.ManagedInstallerClass.InstallHelper(args) bên trong một khối try/catch (nó cũng đặt văn hóa giao diện người dùng các thread hiện hành và hiển thị các bản quyền). ManagedInstallerClass.InstallHelper chính nó nằm trong hội đồng System.Configuration.Install.dll, có thể truy cập được với mọi người. Vì vậy, tôi chỉ cần sửa đổi phương thức Program.Main của dịch vụ của tôi để cho phép cài đặt. Xem mã nhanh chóng và bẩn bên dưới:

static class Program 
{ 
    static void Main(string[] args) 
    { 
     if (args != null && args.Any(arg => arg == "/i" || arg == "/u")) 
     { 
      // Install or Uninstall the service (mimic InstallUtil.exe) 
      System.Configuration.Install.ManagedInstallerClass.InstallHelper(args); 
     } 
     else 
     { 
      // Run the service 
      System.ServiceProcess.ServiceBase[] ServicesToRun; 
      ServicesToRun = new System.ServiceProcess.ServiceBase[] 
      { 
       new MyService() 
      }; 
      System.ServiceProcess.ServiceBase.Run(ServicesToRun); 
     } 
    } 
} 

Bạn có thể làm tương tự hoặc tạo phiên bản InstallUtil của riêng bạn.

+0

Đây là một giải pháp tốt và làm việc cho tôi. Khi bộ nạp lắp ráp thực hiện trong ngữ cảnh ứng dụng, nó có thể tìm thấy các assembly riêng của nó bằng cách sử dụng tệp thăm dò ý kiến, không giống như InstallUtil.exe, không tuân theo lệnh exe.config –

Các vấn đề liên quan