2016-04-11 3 views
1

Ich habe den folgenden Code, der einen Dienst beendet und die Installation rückgängig macht. Es den Dienst richtig hält, aber es gibt mir diese Fehlermeldung, wenn ich versuche, un-install:Objektverweis nicht auf eine Instanz eines Objekts festgelegt, wenn versucht wird, einen Dienst zu deinstallieren C#

System.NullReferenceException: Object reference not set to an instance of an object. 
    at System.Configuration.Install.Installer.Uninstall(IDictionary savedState) 
    at System.ServiceProcess.ServiceInstaller.Uninstall(IDictionary savedState) 
    at UpdateOrca.FuncoesUpdater.StopService(String serviceName, Int32 timeoutMilliseconds, Boolean Unninstall) in C:\Users\me\Downloads\UpdateOrcaV2013\UpdateOrca\UpdateOrca\FuncoesUpdater.cs:line 165 

Code:

public void StopService(string serviceName, int timeoutMilliseconds, bool Unninstall) 
    { 
     if (ServicoInstalado(serviceName) == true) //&& ServiceRunning(serviceName) == true 
     { 
      ServiceController service = new ServiceController(serviceName); 
      try 
      { 
       TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 

       service.Stop(); 
       service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
       ServiceInstaller ServiceInstallerObj = new ServiceInstaller(); 
       if (Unninstall == true) 
       { 
        ServiceInstallerObj.ServiceName = serviceName; 
        ServiceInstallerObj.Uninstall(null); (LINE OF THE ERROR) 
       } 

      } 
      catch (Exception ex) 
      { 
       Program.Erro = ex.ToString(); 
       Erro NewErro = new Erro(); 
       NewErro.ShowDialog(); 
      } 
     } 
    } 

Antwort

1

Die ServiceInstaller.Uninstall() Methode erfordert tatsächlich eine Art von Kontextinformationen über das, was Sie sind Deinstallieren. Dies kann in der Regel in als IDictionary Objekt an die Uninstall() Methode übergeben werden, aber wenn Sie sich entscheiden null in anstatt passieren, werden Sie wahrscheinlich den Kontext explizit festlegen müssen:

// Build your uninstaller 
ServiceInstaller ServiceInstallerObj = new ServiceInstaller(); 
if (Unninstall) 
{ 
     // Set a context (using a specific file to log uninstall info) 
     ServiceInstallerObj.Context = new InstallContext("{path-to-log-file}", null); 
     // Continue setting your service and uninstalling it 
     ServiceInstallerObj.ServiceName = serviceName; 
     ServiceInstallerObj.Uninstall(null); 
} 

Wenn das nicht funktioniert, Sie können einen Ansatz ähnlich dem in this related discussion erwähnten versuchen.

+0

Thx für die schnelle Antwort. Es funktioniert: D –