2012-07-03 15 views
5

Chciałbym utworzyć konfigurację dla mojej usługi Windows. Biblioteki DLL z mojej usługi Windows są umieszczone w katalogu/Lib /.Instalowanie usługi .net Windows z folderem lib

Dodałem klasę instalatora do usługi. Dodano niestandardową akcję w projekcie instalacji.

Problemem jest to, że gdy próbuję zainstalować usługę - nie powiedzie się z powodu błędu: Error 1001. Nie można uzyskać typów instalatora w ...

Ten błąd zdarza się, ponieważ DLL nie są takie same katalog jako usługa .exe. używam sondowanie w config usług i zainstalować util nie rozpoznaje, że sondowanie ..

Chciałem znaleźć pracę wokół dla tego problemu i Próbowalismy na wiele sposobów, aby utworzyć usługi przy użyciu kontrolera usługa (sc. exe). Próba uruchomienia go jako niestandardowej akcji przy użyciu programu cmd.exe. Itd ..

To powinien być powszechny problem. Czy ktoś znalazł odpowiednie rozwiązanie?

Odpowiedz

0

Powiąż zadanie AppDomain.AssemblyResolve i wykonaj niestandardowe ładowanie w module obsługi zdarzeń.

Próbkę można znaleźć w pierwszej odpowiedzi na this SO question.

+0

Obecnie jestem po prostu za pomocą config wiążący .. To dlatego montujemy util nie rozpoznaje DLL .. Usługa działa, gdy używam Sc.exe .. To po prostu nie działa, używając installutil – Lee

+0

@Lior: Właśnie usunąłem odpowiedź, ponieważ myślę, że to zadziała. InstallUtil będzie musiał załadować twój zestaw w CLR, w którym to czasie zdarzenie 'AppDomain.AssemblyResolve' zostanie podniesione dla wszystkich twoich zależności. Proszę spróbować. Ma sens (przynajmniej dla mnie). –

2

ja miałem ten sam problem, i żadna z opcji sugerowane w tym poście lub MSDN pomógł. Pomyślałem inne rozwiązanie:

Korzystając reflektor na InstallUtil.exe, odkryłem, że InstallUtil jest jedynie cienka nakładka na wywołanie System.Configuration.Install.ManagedInstallerClass.InstallHelper(args) wewnątrz bloku try/catch (również zestawy UI kultury bieżącego wątku i wyświetla prawa autorskie). ManagedInstallerClass.InstallHelper sam znajduje się w zestawie System.Configuration.Install.dll, dostępnym dla wszystkich. W ten sposób zmodyfikowałem po prostu metodę mojej usługi Program.Main, aby umożliwić instalację. Zobacz szybki i brudny kod poniżej:

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

Możesz zrobić to samo lub stworzyć własną wersję InstallUtil.

+0

To jest dobre rozwiązanie i zadziałało dla mnie. Gdy moduł ładujący złożenia jest uruchamiany w kontekście aplikacji, może znaleźć własne zestawy za pomocą metody probePath, w przeciwieństwie do InstallUtil.exe, która nie respektuje pliku exe.config –

Powiązane problemy