2016-07-11 20 views
1

Ich habe eine Konsolenanwendung, die sich optional selbst als Dienst installiert. Dies funktioniert gut, aber ich möchte einige Argumente in den Dienststart einzubetten - ähnlich wie (zum Beispiel) von Google Update ServiceSelbstinstallation eines Dienstes, der mit Parametern ausgeführt wird

enter image description here

Also lassen Sie uns (die den Parameter /medsvc hat) sagen, ich mag würde mein Service

MyService.exe RUN Test1

.. zu starten, so dass bis MyService.exe mit den Parametern RUN und Test1 beginnen würde.

kann ich den Service in Ordnung installieren, jedoch

ManagedInstallerClass.InstallHelper(new[] {Assembly.GetExecutingAssembly().Location}); 

verwenden, da auf dem Dienst keine Parameter ist. Also, wenn ich versuche:

ManagedInstallerClass.InstallHelper(new[] {Assembly.GetExecutingAssembly().Location +" RUN Test1"}); 

ich eine FileNotFoundException bekommen. Geben, dass es ein Array ist, dachte ich, ich würde versuchen:

ManagedInstallerClass.InstallHelper(new[] {Assembly.GetExecutingAssembly().Location,"RUN","Test1"}); 

.., die die gleiche Ausnahme gibt, mit der Ausnahme, dass es versucht, RUN die Datei zu finden, jetzt.

Ich kann keine spezifische Dokumentation finden, wie dies zu erreichen ist - weiß jemand, ob es möglich ist, Parameter in den ausführbaren Pfad des Dienstes einzubetten? Ein weiteres Beispiel ist der Update-Service von Google mit Parametern - ich möchte letztendlich dasselbe erreichen.

Antwort

0

Nur Parameter vor dem Standort werden in den Kontext für das Installationsprogramm übernommen. Try this:

args = new[] { "/ServiceName=WinService1", Assembly.GetExecutingAssembly().Location }; 
ManagedInstallerClass.InstallHelper(args); 

Referenz von einer anderen Antwort: Passing Parameter Collection to Service via InstallHelper

+1

Ich fürchte, dass scheint nichts zu tun - obwohl der Dienst mit diesem Code installiert, hat es noch keine Parameter auf dem ausführbaren Pfad. – KenD

0

Es dauerte eine Weile, dies heraus zu finden, ich hoffe, es jemand noch nützlich ist. Zuerst fand ich heraus, dass Sie nicht auf MSDN-Dokumentation nach laufen ManagedInstallerClass.InstallHelper sollen:

Diese API Produkt-Infrastruktur unterstützt und ist nicht direkt von Ihrem Code verwendet werden.

Dann fand ich heraus, dass ich konnte nur meine eigene Project (eine Komponente der Klasse I einen Service-Installer und einen Serviceprozess Installer enthaltend) nutzen den Service wie folgt zu installieren:

ProjectInstaller projectInstaller = new ProjectInstaller(); 
      string[] cmdline = { string.Format("/assemblypath={0} \"/myParam\"", Assembly.GetExecutingAssembly().Location) }; 
      projectInstaller.Context = new InstallContext(null, cmdline); 

      System.Collections.Specialized.ListDictionary state = new System.Collections.Specialized.ListDictionary(); 
      projectInstaller.Install(state); 

Achten Sie darauf, kapseln Sie Ihre Parameter in Anführungszeichen und flüchten Sie die Anführungszeichen, andernfalls werden Ihre Parameter Teil des ausführbaren Pfads und können nicht gestartet werden.

Das Endergebnis ist ein neuer Dienst mit den angegebenen Eigenschaften in Ihrem Service Installer und Service Process Installer und ein Pfad wie in Ihrem Screenshot (mit dem Parameter/medsvc zum Beispiel).