2012-02-01 174 views
0

我正在嘗試爲我的Windows服務創建msi安裝。創建msi的原因是,預期的用戶希望能夠儘可能少地進行干預來快速安裝服務。在MSI安裝期間配置App.config應用程序設置vb.net

我可以得到安裝爲msi的服務,但我的代碼中有一個變量,我需要用戶定義msi的安裝時間。我從用戶需要的變量是他們希望我的服務創建的xml文件位於的文件路徑。

我想我可以配置app.config應用程序設置來包含xml文件應寫入的文件路徑。然而,我正在努力做到這一點,我不確定它是否是最好的方法呢?

我有我的安裝項目,其中包含我的可執行文件,並有我的文本框將包含用戶的一個變量。 setup project

我有一個安裝程序類,其中包含我的serviceinstaller和進程安裝程序。這就是我努力理解接下來要做什麼的地方。 Installer class 我是否需要重寫安裝方法?我安裝程序類的當前的代碼是自動生成的,如下:

Imports System.Configuration.Install 
Imports System.Configuration 

<System.ComponentModel.RunInstaller(True)> Partial Class ProjectInstaller 
Inherits System.Configuration.Install.Installer 

'Installer overrides dispose to clean up the component list. 
<System.Diagnostics.DebuggerNonUserCode()> _ 
Protected Overrides Sub Dispose(ByVal disposing As Boolean) 
    Try 
     If disposing AndAlso components IsNot Nothing Then 
      components.Dispose() 
     End If 
    Finally 
     MyBase.Dispose(disposing) 
    End Try 
End Sub 

'Required by the Component Designer 
Private components As System.ComponentModel.IContainer 

'NOTE: The following procedure is required by the Component Designer 
'It can be modified using the Component Designer. 
'Do not modify it using the code editor. 
<System.Diagnostics.DebuggerStepThrough()> _ 
Private Sub InitializeComponent() 
    Me.ServiceProcessInstaller1 = New System.ServiceProcess.ServiceProcessInstaller() 
    Me.ServiceInstaller1 = New System.ServiceProcess.ServiceInstaller() 
    ' 
    'ServiceProcessInstaller1 
    ' 
    Me.ServiceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem 
    Me.ServiceProcessInstaller1.Password = Nothing 
    Me.ServiceProcessInstaller1.Username = Nothing 
    ' 
    'ServiceInstaller1 
    ' 
    Me.ServiceInstaller1.ServiceName = "Spotter" 
    Me.ServiceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic 
    ' 
    'ProjectInstaller 
    ' 
    Me.Installers.AddRange(New System.Configuration.Install.Installer() {Me.ServiceProcessInstaller1, Me.ServiceInstaller1}) 

End Sub 

Friend WithEvents ServiceProcessInstaller1 As System.ServiceProcess.ServiceProcessInstaller 
Friend WithEvents ServiceInstaller1 As System.ServiceProcess.ServiceInstaller 

End Class 

我甚至可以添加CustomActionData值。該字符串決定了傳遞到用於收集輸入的用戶值的上下文對象中的內容。 param1是我的變量名稱。 custom actions

我非常努力的安裝程序代碼...我想?

回答

0

要考慮的一個選擇是使用第三方安裝程序,如Installshield,它具有內置支持修改xml配置文件(如配置文件)的支持。

但是,如果你想自己推出,你肯定需要重寫Install方法。您在CustomData中傳遞的任何參數都將在作爲此方法的參數傳遞的字典中可用。

例如:

Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary) 
    MyBase.Install(stateSaver) 

    If Me.Context.Parameters.Count <> 0 Then 

     For Each sKey As String In Context.Parameters.Keys 
      Select Case sKey.ToUpper 
       Case "PARAM1" 
        ' XML directory 
        Me.XMLDir = Context.Parameters(sKey) 

      End Select 
     Next 
    End If 
End Sub 

在這樣的情況下,我們總是將值寫入註冊表,使用戶不必如果他們卸載重新輸入或重新安裝。

我不確定用於修改app.config的事件的確切順序,但可以寫入註冊表,然後在服務第一次啓動時修改app.config。

您可能還會發現,您需要從提交階段刪除自定義操作,以便安裝程序成功運行。

+0

感謝您的回覆。閱讀你的榜樣,努力完全理解它。什麼是變量Me.XMLDir? – Simon 2012-02-01 22:02:21

+0

該變量僅用於顯示提取在customdata中傳遞的值。這是你將用來更新app.config。 – 2012-02-02 06:35:40

相關問題