2010-09-09 5 views
0

Après avoir recherché des informations sur le Web, j'ai réussi à créer un service qui, selon la ligne de commande, peut s'installer ou se désinstaller, ou simplement être exécuté en tant qu'application.Désinstallation de Windows Service par programme .NET

Toutefois, le code de désinstallation ne fonctionne pas correctement.

Le code connexe:

Private Function UnInstallService(ByVal args As String(), ByRef errMsg As String) As Boolean 
    Dim si As New ServiceInfo 

    If (Not GetServiceInfo(args, si)) Then 
     errMsg = "Error..." 
     Return False 
    End If 

    If (Not IsServiceInstalled(si.Name)) Then 
     errMsg = "Error..." 
     Return False 
    End If 

    Try 
     Dim installer As ServiceProcessInstaller = GetServiceInstaller(si) 
     Dim stateSaver As IDictionary = New Hashtable 
     Try 
      installer.Uninstall(stateSaver) 
     Catch e As exception 
      errMsg = "Error..." 
      Return False 
     End Try 
    Catch e As exception 
     errMsg = "Error..." 
     Return False 
    End Try 
End Function 

Private Function GetServiceInstaller(ByVal si As ServiceInfo) As ServiceProcessInstaller 
    Dim installer As ServiceInstaller = New ServiceInstaller() 
    Dim pInstaller As New ServiceProcessInstaller 
    pInstaller.Context = New InstallContext("", si.CommandLine) 

    installer.Description = si.Description 
    installer.DisplayName = si.DisplayName 
    installer.ServiceName = si.Name 
    installer.StartType = ServiceStartMode.Automatic 

    If (si.Account = "LocalSystem") Then 
     pInstaller.Account = ServiceAccount.LocalSystem 
    ElseIf (si.Account = "LocalService") Then 
     pInstaller.Account = ServiceAccount.LocalService 
    ElseIf (si.Account = "NetworkService") Then 
     pInstaller.Account = ServiceAccount.NetworkService 
    Else 
     pInstaller.Account = ServiceAccount.User 
     pInstaller.Password = si.Password 
     pInstaller.Username = si.Account 
    End If 

    pInstaller.Context.Parameters("assemblypath") = si.FullPath 

    pInstaller.Installers.Add(installer) 
    installer.Parent = pInstaller 

    Return pInstaller 
End Function 

Il jette un NullReferenceException dans l'appel à installer.Uninstall Le code pour l'installation est exactement le même, sauf pour vérifier si le service est installé, et appelant Installer.Install puis installer.Commit au lieu de désinstaller. Je le passe exactement les mêmes paramètres.

Une idée?

Répondre

1

Votre code semble un peu verbeux, tout ce que je fais désinstaller est appel:

Dim path As String = Assembly.GetExecutingAssembly().Location 
ManagedInstallerClass.InstallHelper(New String() {"/u", path}) 

Pour installer tout ce que je fais est:

Dim path As String = Assembly.GetExecutingAssembly().Location 
ManagedInstallerClass.InstallHelper(New String() {path}) 

Et puis j'ai un code dans la constructeur de mon ProjectInstaller qui définit le nom d'utilisateur etc

Modifier: Bien que sachez que la documentation pour le ManagedInstallerClass a la citation suivante: L'API prend en charge l'infrastructure .NET Framework et n'est pas destinée à être utilisée directement à partir de votre code.
Il pourrait ne pas être la preuve future de l'utiliser à partir de votre propre code ...

+0

Eh bien, selon MSDN: "Cette méthode de support s l'infrastructure .NET Framework et n'est pas destiné à être utilisé directement à partir de votre code. " http://msdn.microsoft.com/en-us/library/system.configuration.install.managedinstallerclass.installhelper%28v=VS.80%29.aspx Je vais y jeter un coup d'oeil, de toute façon. Je vous remercie! – raven

Questions connexes