七).打包時加入卸載功能:
方法一:
1.在打包項目中添加檔案msiexec.exe(一般可在c:\windows\system32\下找到)
2.在檔案系統視圖中選擇應用程式檔案夾,在msiexec.exe上按右鍵,選擇創建捷徑,重新命名捷徑為"卸載".
3.更改此捷徑的Arguments 為"/x {產品id}",產品id的值為打包項目的ProductCode屬性值.
方法二:(推薦)
1.先產生安裝包,記下ProductCode(選擇方案總管根目錄如setup1,再查看屬性標籤,不是右鍵中的屬性),下面要用到
2.用VS.net建立一個新的控制台程式uninst.exe檔案
'power by: landlordh
'for 2000,xp,2003
Module uninstall
Sub Main()
Dim myProcess As Process = New Process
If System.Environment.OSVersion.ToString.IndexOf("NT 5") Then
myProcess.Start("msiexec", "/X{2B65D4A9-C146-4808-AB4B-321FB0779559}") '改為自己的ProductCode
End If
myProcess.Close()
End Sub
End Module
3.將控制台程式BIN目錄的exe檔案加入到打包程式檔案中,在程式組建立uninst.exe的捷徑
<RunInstaller(True)> Public Class Installer1
Inherits System.Configuration.Install.Installer
#Region " 組件設計器產生的程式碼 "
Public Sub New()
MyBase.New()
'該調用是組件設計器所必需的。
InitializeComponent()
'在 InitializeComponent() 調用之後添加任何初始化
End Sub
'Installer 重寫 dispose 以清理組件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'組件設計器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下過程是組件設計器所必需的
'可以使用組件設計器來修改此過程。
'不要使用代碼編輯器來修改它。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
components = New System.ComponentModel.Container
End Sub
#End Region
Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
MyBase.Install(stateSaver)
If Not InstallDB() Then
'失敗,反安裝
Me.Uninstall(stateSaver)
Exit Sub
End If
DeleteFile(String.Format("{0}DB.dat", Me.Context.Parameters.Item("targetdir")))
End Sub
Public Overrides Sub Uninstall(ByVal stateSaver As System.Collections.IDictionary)
'執行反安裝
MyBase.Uninstall(stateSaver)
DeleteFile(String.Format("{0}DB.dat", Me.Context.Parameters.Item("targetdir")))
End Sub
Private Sub DeleteFile(ByVal paths As String)
'刪除指定的檔案
Try
Dim delFile As New System.IO.FileInfo(paths)
If delFile.Exists Then
delFile.Delete()
End If
Catch ex As Exception
End Try
End Sub
Private Sub CreateSql(ByVal paths As String)
Dim File As System.IO.StreamWriter
Dim db As String = String.Format("{0}", Me.Context.Parameters.Item("dbname"))
Dim path As String = String.Format("{0}", Me.Context.Parameters.Item("targetdir"))
Try
Dim s As New System.Text.StringBuilder
s.Append("use master" & vbCrLf)
s.Append("" & vbCrLf)
s.Append("if not exists (select * from sysdatabases where name='" & db & "')" & vbCrLf)
s.Append(" BEGIN" & vbCrLf)
s.Append(" create database " & db & vbCrLf)
s.Append(" END" & vbCrLf)
s.Append("" & vbCrLf)
s.Append("if exists (select * from sysdevices where name='DBdisk')" & vbCrLf)
s.Append(" BEGIN" & vbCrLf)
s.Append(" EXEC sp_dropdevice 'DBdisk'" & vbCrLf)
s.Append(" END" & vbCrLf)
s.Append("Else" & vbCrLf)
s.Append(" BEGIN" & vbCrLf)
s.Append(" EXEC sp_addumpdevice 'disk','DBdisk', '" & path & "DB.dat'" & vbCrLf)
s.Append(" END" & vbCrLf)
s.Append("" & vbCrLf)
s.Append("restore database " & db & vbCrLf)
s.Append("from disk='" & path & "DB.dat'" & vbCrLf)
s.Append("with replace")
File = New System.IO.StreamWriter(paths)
File.Write(s.ToString)
Catch ex As Exception
Finally
File.Close()
End Try
End Sub
Private Function InstallDB() As Boolean
'安裝資料庫,調用自動批處理。
Try
'建立臨時指令碼
CreateSql(String.Format("{0}Mydb2000tp.sql", Me.Context.Parameters.Item("targetdir")))
'調用osql執行指令碼
Dim sqlProcess As New System.Diagnostics.Process
sqlProcess.StartInfo.FileName = "osql.exe"
sqlProcess.StartInfo.Arguments = String.Format(" -U {0} -P {1} -S {2} -i {3}Mydb2000tp.sql", Me.Context.Parameters.Item("user"), Me.Context.Parameters.Item("pwd"), Me.Context.Parameters.Item("server"), Me.Context.Parameters.Item("targetdir"))
sqlProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
sqlProcess.Start()
sqlProcess.WaitForExit() '等待執行
sqlProcess.Close()
'刪除指令檔
DeleteFile(String.Format("{0}Mydb2000tp.sql", Me.Context.Parameters.Item("targetdir")))
Return True
Catch ex As Exception
Return False
End Try
End Function