一.創建部署.NET打包項目
1. 在“文件”菜單上指向“添加項目”,然后選擇“新建項目”。
2.?在“添加新項目”對話框中,選擇“項目類型”窗格中的“安裝和部署項目”,然后選擇“模板”窗格中的“安裝項目”。在“名稱”框中鍵入 setup。
3.?單擊“確定”關閉對話框。
?
4.?項目被添加到解決方案資源管理器中,并且文件系統編輯器打開。
?
5.?在“屬性”窗口中,選擇 ProductName 屬性,并鍵入?[ 項目名稱 ] 。
?
二.將主程序項目的輸出添加到部署項目中
?
1.?在“文件系統編輯器”中,選擇“應用程序文件夾”。在“操作”菜單上,指向“添加”,然后選擇“項目輸出”。
?
2.?在“添加項目輸出組”對話框中,選擇“項目”下拉列表中的“你的程序”。
?
3.?單擊“確定”關閉對話框。
?
4.?從列表中選擇“主輸出”和“內容文件”組,然后單擊“確定”。
?
三.創建安裝程序類
?
1.?在“文件”菜單上指向“新建”,然后選擇“項目”。
?
2.?在“新建項目”對話框中,選擇“項目類型”窗格中的“Visual Basic 項目”,然后選擇“模板”窗格中的“類庫”。在“名稱”框中鍵入 installDB。
?
3.?單擊“打開”關閉對話框。
?
4.?從“項目”菜單中選擇“添加新項”。
?
5.?在“添加新項”對話框中選擇“安裝程序類”。在“名稱”框中鍵入 installDB。
?
6.?單擊“確定”關閉對話框。
?
7.?詳細代碼附后。
?
四.創建自定義安裝對話框
?
1.?在解決方案資源管理器中選擇“setup1”項目。在“視圖”菜單上指向“編輯器”,然后選擇“用戶界面”。
2.?在用戶界面編輯器中,選擇“安裝”下的“啟動”節點。在“操作”菜單上,選擇“添加對話框”。
3.?在“添加對話框”對話框中,選擇“許可協議”對話框,然后單擊“確定”關閉對話框。
4.?在“添加對話框”對話框中,選擇“文本框 (A)”對話框,然后單擊“確定”關閉對話框。
5.?在“操作”菜單上,選擇“上移”。重復此步驟,直到“文本框 (A)”對話框位于“安裝文件夾”節點之上。
6.?在“屬性”窗口中,選擇 BannerText 屬性并鍵入:安裝數據庫.
7.?選擇 BodyText 屬性并鍵入:安裝程序將在目標機器上安裝數據庫
8.?選擇 Edit1Label 屬性并鍵入:數據庫名稱:
9.?選擇 Edit1Property 屬性并鍵入 CUSTOMTEXTA1
10.?選擇 Edit1Value 屬性并鍵入:dbservers
11.?選擇 Edit2Label 屬性并鍵入:服務器名:
12.?選擇 Edit2Property 屬性并鍵入 CUSTOMTEXTA2
13.?選擇 Edit2Value 屬性并鍵入:(local)
14.?選擇 Edit3Label 屬性并鍵入:用戶名:
15.?選擇 Edit3Value 屬性并鍵入:sa
16.?選擇 Edit3Property 屬性并鍵入 CUSTOMTEXTA3
17.?選擇 Edit4Label 屬性并鍵入:密碼:
18.?選擇 Edit4Property 屬性并鍵入 CUSTOMTEXTA4
19.?選擇 Edit2Visible、Edit3Visible 和 Edit4Visible 屬性,并將它們設置為 true
?
五.創建自定義操作
?
1.?在解決方案資源管理器中選擇“setup1”項目。在“視圖”菜單上指向“編輯器”,然后選擇“自定義操作”。
2.?在自定義操作編輯器中選擇“安裝”節點。在“操作”菜單上,選擇“添加自定義操作”。
3.?在“選擇項目中的項”對話框中,雙擊“應用程序文件夾”。
4.?選擇“主輸出來自 installDB(活動)”項,然后單擊“確定”關閉對話框。
5.?在“屬性”窗口中,選擇 CustomActionData 屬性并鍵入“/dbname=[CUSTOMTEXTA1] /server=[CUSTOMTEXTA2] /user=[CUSTOMTEXTA3] /pwd=[CUSTOMTEXTA4] /targetdir="[TARGETDIR]\"”。
?
附:/targetdir="[TARGETDIR]\"是安裝后的目標路徑,為了在installDB類中獲得安裝后的路徑,我們設置此參數。
?
六 .NET打包時加入卸載功能:
?
方法一:
1.在.NET打包項目中添加文件msiexec.exe(一般可在c:\windows\system32\下找到)
2.在文件系統視圖中選擇應用程序文件夾,在msiexec.exe上按右鍵,選擇創建快捷方式,重命名快捷方式為"卸載".
3.更改此快捷方式的Arguments 為"/x {產品id}",產品id的值為打包項目的ProductCode屬性值.
1.在.NET打包項目中添加文件msiexec.exe(一般可在c:\windows\system32\下找到)
2.在文件系統視圖中選擇應用程序文件夾,在msiexec.exe上按右鍵,選擇創建快捷方式,重命名快捷方式為"卸載".
3.更改此快捷方式的Arguments 為"/x {產品id}",產品id的值為打包項目的ProductCode屬性值.
?
方法二:(推薦)
1.先生成安裝包,記下ProductCode(選擇解決方案資源管理器根目錄如setup1,再查看屬性標簽,不是右鍵中的屬性),下面要用到
2.用VS.net建立一個新的控制臺程序uninst.exe文件
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的快捷方式
?
installdb.vb類,要添加引用 system.configuration.install.dll :
-
usingSystem; ?
-
usingSystem.Collections; ?
-
usingSystem.ComponentModel; ?
-
usingSystem.Configuration.Install; ?
-
usingSystem.Reflection; ?
-
usingSystem.IO; ?
-
usingSystem.Data; ?
-
usingSystem.Data.SqlClient; ?
-
namespaceinstall{ ?
-
/// ?
-
///Installer1的摘要說明。 ?
-
/// ?
-
[RunInstaller(true)] ?
-
publicclassInstaller1:System.Configuration.Install.Installer{ ?
-
/// ?
-
///必需的設計器變量。 ?
-
/// ?
-
privateSystem.ComponentModel.Containercomponents
=
null
; ?
-
publicInstaller1(){ ?
-
//該調用是設計器所必需的。 ?
-
InitializeComponent(); ?
-
//TODO:在InitializeComponent調用后添加任何初始化 ?
-
} ?
-
/// ?
-
///清理所有正在使用的資源。 ?
-
/// ?
-
protectedoverridevoidDispose(booldisposing){ ?
-
if(disposing){ ?
-
if(components!=null){ ?
-
components.Dispose(); ?
-
} ?
-
} ?
-
base.Dispose(disposing); ?
-
} ?
-
?
-
#region組件設計器生成的代碼 ?
-
/// ?
-
///設計器支持所需的方法-不要使用代碼編輯器修改 ?
-
///此方法的內容。 ?
-
/// ?
-
privatevoidInitializeComponent(){ ?
-
components
=
newSystem
.ComponentModel.Container(); ?
-
} ?
-
#endregion ?
-
privatestringGetSql(stringName){ ?
-
////調用osql執行腳本 ?
-
// ?
-
//
System.Diagnostics.ProcesssqlProcess
=
newSystem
.Diagnostics.Process(); ?
-
// ?
-
//
sqlProcess.StartInfo.FileName
=
"osql.exe"
; ?
-
// ?
-
//
sqlProcess.StartInfo.Arguments
=
String
.Format("-U{0}-P{1}-d{2}-i{3}db.sql",
this.Context.Parameters["user"],this.Context.Parameters["pwd"],"master",this.
Context.Parameters["targetdir"]); ?
-
// ?
-
//
sqlProcess.StartInfo.WindowStyle
=
System
.Diagnostics.ProcessWindowStyle.Hidden; ?
-
// ?
-
//sqlProcess.Start(); ?
-
// ?
-
//sqlProcess.WaitForExit();//等待執行 ?
-
// ?
-
//sqlProcess.Close(); ?
-
try{ ?
-
//
Assembly
AssemblyAsm
=Assembly.GetExecutingAssembly(); ?
-
//
System.IO.FileInfoFileInfo
=
newSystem
.IO.FileInfo(Asm.Location); ?
-
//
stringpath
=
FileInfo
.DirectoryName+@"\"+Name; ?
-
stringpath
=
this
.Context.Parameters["targetdir"]+Name; ?
-
FileStreamfs
=
newFileStream
(path,FileMode.Open,FileAccess.Read,FileShare.Read); ?
-
StreamReaderreader
=
newStreamReader
(fs,System.Text.Encoding.Default); ?
-
//System.Text.Encoding.ASCII; ?
-
returnreader.ReadToEnd(); ?
-
} ?
-
catch(Exceptionex){ ?
-
Console.Write("InGetSql:"+ex.Message); ?
-
throwex; ?
-
} ?
-
} ?
-
privatevoidExecuteSql(stringDataBaseName,stringSql){ ?
-
SqlConnectionsqlConnection1
=
newSqlConnection
(); ?
-
sqlConnection1.ConnectionString
=
string
.Format("
server
={0};
userid
={1};
password
={2};
-
Database
=master",this.Context.Parameters["server"],this.Context.Parameters["user"],
this.Context.Parameters["
pwd
"]); ?
-
System.Data.SqlClient.SqlCommandCommand
=
newSystem
.Data.SqlClient.
SqlCommand(Sql,sqlConnection1); ?
-
try{ ?
-
Command.Connection.Open(); ?
-
Command.Connection.ChangeDatabase(DataBaseName); ?
-
Command.ExecuteNonQuery(); ?
-
} ?
-
catch(Exceptionex){ ?
-
Console.Write("Inexceptionhandler:"+ex.Message); ?
-
} ?
-
finally{ ?
-
Command.Connection.Close(); ?
-
} ?
-
} ?
-
protectedvoidAddDBTable(stringstrDBName){ ?
-
try{ ?
-
ExecuteSql("master","CREATEDATABASE"+strDBName); ?
-
ExecuteSql(strDBName,GetSql("sql.txt")); ?
-
ExecuteSql("master","execsp_addlogin'myoamaster','myoamaster','"+strDBName+"',Null,Null"); ?
-
ExecuteSql(strDBName,"EXECsp_grantdbaccess'myoamaster','myoamaster'"); ?
-
ExecuteSql(strDBName,"execsp_addrolemember'db_owner','myoamaster'"); ?
-
} ?
-
catch(Exceptionex){ ?
-
Console.Write("Inexceptionhandler:"+ex.Message); ?
-
} ?
-
} ?
-
publicoverridevoidInstall(System.Collections.IDictionarystateSaver){ ?
-
base.Install(stateSaver); ?
-
AddDBTable(this.Context.Parameters["dbname"]); ?
-
} ?
-
} ?
-
}?
這里有個sql.txt是數據庫的sql腳本,當然可以調用osql來執行sql腳本,其實是一樣的。打包的時候必須把sql.txt文件加進來,否則不會執行。如果你想附加數據庫的mdf文件和ldf文件,用下面這段程序:
-
privatevoidCreateDataBase(stringstrSql,stringDataName,stringstrMdf,stringstrLdf) ?
-
{ ?
-
Stringstr; ?
-
SqlConnectionmyConn
=
newSqlConnection
(strSql); ?
-
//EXECsp_detach_db@
dbname
=
'BX_FreightMileage_2'
//需要先將數據庫分離出來 ?
-
str
=
"EXECsp_attach_db@dbname='"
+DataName+"',@
filename1
=
'"+strMdf+"'
,@
filename2
=
'"+strLdf+"'
"; ?
-
SqlCommandmyCommand
=
newSqlCommand
(str,myConn); ?
-
?
-
myConn.Open(); ?
-
myCommand.ExecuteNonQuery(); ?
-
myConn.Close(); ?
-
?
-
}?
當然.NET打包項目也要把這兩個數據庫文件也加進來。
?
?
?
123
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

