首頁 培訓計劃 培訓課程 企業內訓 學員論壇 技術文章 成功案例 師資簡介 關于我們 在線留言  
.NET開發資料
Asp.net 安裝包制作

文章來源:http://www.cnblogs.com/hsrzyn/archive/2009/10/10/1579868.html 作者: 發布日期:2011-09-16
打 印】【關 閉

要求將做好的網站打包,以前沒接觸過這方面的東西,感覺挺好玩的,就在網上大肆搜索,折騰了一天多,看的也是暈暈乎乎的,不過最終還是弄出來了;

      主要參考:
      
http://xucanzhao.cnblogs.com/archive/2005/10/02/248063.html這個比較詳細,也是我看的第一個,照著一步一步來,最起碼知道添加用戶界面,添加操作了,可到最關鍵那步,代碼那出問題了,他用的是vb,我熟悉的是C#
,改了半天沒改出來。
      
http://blog.csdn.net/abaowu/archive/2004/11/23/191908.aspx 提供的http://topic.csdn.net/t/20040913/17/3368253.html 7 goody9807的回復)里找到了,到這也基本上明白這個“安裝程序類
”的作用了
      
還得在安裝的同時配置虛擬目錄,http://www.cnblogs.com/nerocool/archive/2008/08/13/1266733.html
這里有個實例(演示的很詳細的,也有個制作安裝包的過程,是個pdf文件),強烈推薦下載后看看
接下來動手做一個,先創建個空白解決方案,選“其他項目類型”里的“Visual Studio 解決方案”,名字和位置自己隨意定啊,在這就叫做InstallSolution了。



      在解決方案資源管理里新建項目,選“其他項目類型”里的“安裝和部署”,選擇“安裝項目”【我選的是這個,在網上搜了幾個都用的是web安裝項目,從字面上來說web安裝項目似乎更合適,但我這web安裝項目我暫時沒試成功,下去再試試】,名字就叫setup吧,



      
注意下紅色標注的這幾個圖標,在實際操作中可以很方便切換編輯解界面,



 然后對著項目右鍵選擇“視圖——用戶界面”在出現的“用戶界面”中



      在“啟動”上右鍵“添加對話框(從字面上就可以猜出來這樣做的目的就是要彈出個對話框)”選擇需要的對話框



      先添加個“許可協議”的對話框吧(這個框的功能就是安裝程序的時候彈出個窗口,內容是就是一些版權信息或者什么什么
的,如果用戶不點確定是不讓進行下一步操作的),之后就可以在用戶界面“啟動”下面看到這個對話框了,默認新添加的對話框是在最后的,需要右鍵“上移”至合適位置,這個原因就不多說了。
      這個對話框是加上了,可內容呢?呵呵,不急,先來建個文件啊,打開
word,在里面寫上你想讓在“許可協議”這塊顯示的內容,然后“另存為”,在彈出來的屬性窗口中選擇“Rtf
”格式(不要隨便建個文件,然后手動更改后綴名為rtf,要另存為是選擇后綴名,否則不顯示內容)



切換到Vs
上,在“許可協議”這一項右鍵選擇“屬性窗口”,



      在“LicenseFile”上選擇“瀏覽”,找到你剛保存的那個Rtf
文件,這個就好了



      接下來得把網站加進去,對著解決方案,如果你的網站建立的時候用的是WebApplication(這里指使用的是新建項目),就選添加現有項目,然后選擇你的項目,如果你用的是“網站Website(這里只使用的是新建網站)”,就不用選擇添加項目了,下面一個一個說。
      先說是website的,直接把你的website給生成了(就是說在你的website右鍵選擇“發布網站”,要編譯之后的文件【可以直接發布的,里面沒有.cs最后綴名的文件,有.dll的】),接下來復制你編譯好的網站(所有的文件),切換回剛建的這個項目中,切換到文件系統界面(找不到?看解決方案上面得那一串圖標,把鼠標放到第2
個上,點擊就好了)。



      雙擊“應用程序文件夾(我的理解這個文件夾就是用戶在安裝程序的時候生成在用戶計算機中的文件,就好像安裝QQ的話就會生成個名叫QQ的文件夾,里面的文件應該就是編譯好的,可以直接運行,其他的幾個文件夾功能也能夠從字面上看出來,這些自己嘗試吧),在中間(如下圖標注)”那塊粘貼剛復制的文件(編譯好的所有文件)



項目右鍵——“生成”, 這樣就做好了,點擊右鍵“安裝”看看……




      安裝之后的文件時編譯好的,接下來咱看看WebApplication的,剛說了在解決方案上“右鍵”——添加已有項目,添加你的webApplication到這個解決方案,將鼠標移到setup
這個項目上來,右鍵——“添加”——“項目輸出”



      在彈出來的窗口中選擇剛加入的webApplication
項目,然后選中“主輸出”和“內容文件”(這個其他的也可以選擇,根據自己的需要)。



      點擊確定即可,之后和剛才一樣,點擊“生成”,按后“安裝”試試??梢园l現安裝后的文件時編譯好的。為什么website不這樣呢?試試就知道了,



      這里不像
webApplication那樣有那么多的選項,只有內容文件,點擊確定后生成,安裝后是源文件,沒有編譯(原因尚不清楚)…… 這不行吧?如果在用戶機上沒法編譯,那這網站就跑不起來了。

      在安裝中你會發現下面這樣的情況





看下標記的,全是setup,安裝別的程序的時候都是顯示的程序名或者公司信息之類,還有默認路徑怎么是這樣的呢?這個這么改?呵呵,切換回VS,然后選中setup項目,點擊
屬性窗口



      是那個紅色的屬性,不是右鍵屬性,不一樣的。



      把這幾個改改就好了,而且可以改別的,像“
Description”的……
      
      
這樣制作的安裝包總感覺少點什么東西,用戶安裝之后還得自己去裝數據庫,改web.config文件。仔細想想,感覺這個安裝包就是個解壓縮,它就是把編譯好的文件拷貝了一份,有些活還得額外做,能不能在安裝的時候把數據庫建了。O(∩_∩)O這個是可以的……
      現在就說怎么把數據庫給封進去,在解決方案上“新建項目”,選擇“類庫”,



 把默認生成的class1.cs刪除,新建“安裝程序類
”,



      具體代碼先不說,一會在說
      在setup項目上,在添加個“視圖”――“用戶界面”,添加個對話框,這次選擇“文本A”,之后在文本框A上右鍵――“屬性窗口”,修改某些字段



      標記的那幾個名字是以后要用的“變量名”,根據自己的需要設置,這個是很靈活的,只是我這個對話框的目的就是獲取跟數據庫有關的數據,所以就這么寫了。
      這個界面跟寫程序時用的控件的屬性界面是一樣的,做測試屬性名,右側是值。
      其中帶有Label就是讓用戶看的,而帶有Property
是以后在寫代碼的時候要用到的,這先做個記號,待會還得看上面那個圖。
      接下來在
setup項目中
視圖”——“自定義操作



      在自定義操作界面,選擇“安裝”,右鍵“添加自定義操作”,在彈出的窗口中雙擊“應用程序文件夾”,然后選擇“添加輸出”,在“項目”中選擇“
InstallClassLibruary”這個類庫項目,之后選擇“主輸出”和“內容文件”,這樣在“自定義操作界面”就多了個內容,



      在那個多出來的項上右鍵選擇屬性,在
CustomAction中填上    /dbname=[DBNAME]  /server=[SERVER]   /user=[UNAME]  /pwd=[PWD]  /targetdir="[TARGETDIR]"  最后一個帶有“""”注意,“[]”中間的是剛在文本框A的屬性中帶有Property 那幾項填寫的的那幾個,而這些“/”之后的則是在寫程序中要用的,就是為了獲取文本框中輸入的值,targetdir是文件的安裝路徑,需要單獨再加個雙引號,這個是很有用的;

      之后就到剛才建立的那個“安裝程序類”里寫代碼了,看代碼

/// <summary>
        
/// 添加數據
        
/// </summary>

        
/// <param name="DataBaseName"></param>
        
/// <param name="Sql"></param>
        private void ExecuteSql(string DataBaseName, string Sql)
        {
            SqlConnection sqlConnection 
= new SqlConnection("Data Source=" + this.Context.Parameters["server"+

              
";Initial Catalog=master;Persist Security Info=True;User ID=" + this.Context.Parameters["user"+ ";Password=" + this.Context.Parameters["pwd"+ "");

            System.Data.SqlClient.SqlCommand Command 
= new
 System.Data.SqlClient.SqlCommand(Sql, sqlConnection);
            Command.Connection.Open();
            Command.Connection.ChangeDatabase(DataBaseName);
            
try

            {
                Command.ExecuteNonQuery();
            }
            
catch
            {
               
            }
            
finally
            {
                Command.Connection.Close();
            }
        }

        
/// <summary>
        
/// 創建數據庫
        
/// </summary>

        
/// <param name="strDBName"></param>
        protected void AddDBTable(string strDBName)     
      {          
            
try
     
            {              
                ExecuteSql(
"master","CREATE   DATABASE   "+
   strDBName);
            }     
            
catch
(Exception ee)
            {
              MessageBox.Show(
"數據庫創建失??!您可以手動添加,但名稱需要和剛才填寫的數據庫名稱一致! 錯誤信息:\n" + ee.Message,"Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, 0
);
            }     
      }

這個是新建數據庫(注意只有數據庫,沒有表啊,間表得自己寫),就是一般的方法,但僅僅這樣是不行的,它沒法執行,加上這個
public override void
 Install(System.Collections.IDictionary stateSaver)
        
{
            
base
.Install(stateSaver);
            AddDBTable(
this.Context.Parameters["dbname"
]);
           
//
 updateWebConfig();
           
// CreateVirtualDir();

        }

 這就可以執行了,把這個方法寫到Install()里……
      注意public override void Install(IDictionary stateSaver)
這個,需要重寫這個類,然后把你要執行的代碼放在這個方法里,比方說
      建立數據庫,同時得修改Web.config文件吧,再寫個修改web.config的方法,也放到Install里,就可以執行了。

      注意到這個類中有“
this.Context.Parameters["user"] ”的,這個就是剛才在自定義操作的“CustomAction”屬性中那個字段,這樣就可以把用戶輸入的信息獲取到了。

      回憶一下啊
            第一:“添加
用戶界面”,選擇文本框
,
            第二:為文本框中的帶
label和帶property的字段賦值(如propertyUNAME
),
            第三:“自定義
操作”,在屬性窗口的“CustomAction”再次傳遞參數,如“/name=[UNAME]
”,
            第四:在
自定義操作類中,獲取這個參數,如“ this.Context.Parameters["name"]
”,這樣就可以在類中使用用戶輸入的數據了。

      
再附上兩個方法,這個是修改web.config文件的(其實就是讀取xml文件,然后修改一個節點的屬性,需要添加命名空間System.XML)

 private void
 updateWebConfig()
        
{
            
//加載配置文件

            try
            
{
                System.IO.FileInfo FileInfo 
= new System.IO.FileInfo(this.Context.Parameters["targetdir"+ "/web.config"
);
                
if (!
FileInfo.Exists)
                
{
                    
throw new InstallException("缺少配置文件 :" + this.Context.Parameters["targetdir"+ "/web.config"
);
                }

                System.Xml.XmlDocument xmlDocument 
= new System.Xml.XmlDocument();
                xmlDocument.Load(FileInfo.FullName);

                
//修改連接字符串

                foreach (System.Xml.XmlNode Node in xmlDocument["configuration"]["connectionStrings"])
                
{
                    
if (Node.Name == "add"
)
                    
{
                        
if (Node.Attributes.GetNamedItem("name").Value == "你在項目中使用的連接數據庫字符串的名字"
)
                        
{
                            Node.Attributes.GetNamedItem(
"connectionString").Value = String.Format("Data Source={0};Initial Catalog={1};User ID={2};Password={3};"
, dserver, dbname, user, pwd); 
                        }

                    }

                }

                xmlDocument.Save(FileInfo.FullName);
            }

            
catch
            
{
                MessageBox.Show(
"Web.config 配置錯誤!""安裝提示", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, 0
);
            }

        }

還有個生成虛擬目錄的(先添加引用 System.DirectoryServices,然后添加命名空間)
private void
 CreateVirtualDir()
        
{
            
try

            
{
                
string constIISWebSiteRoot = "IIS://" + iis + "/W3SVC/1/ROOT"
;
                DirectoryEntry root 
= new
 DirectoryEntry(constIISWebSiteRoot);
                
//判斷虛擬目錄是否已存在,存在就先刪除再創建【不建議這么做,建議直接報個錯就行】

                DirectoryEntry Exist = root.Children.Find(virtualdir, root.SchemaClassName);
                
if (Exist != null
)
                
{
                    
//刪除虛擬目錄

                    root.Children.Remove(Exist);
                    root.CommitChanges();
                }

                DirectoryEntry newRoot 
= root.Children.Add(virtualdir, root.SchemaClassName);
                newRoot.Properties[
"Path"][0= physicaldir;//設置物理地址

                newRoot.Properties["AppIsolated"][0= 2;             // 值 0 表示應用程序在進程內運行,值 1 表示進程外,值 2 表示進程池
                newRoot.Properties["AccessScript"][0= true;          // 可執行腳本
                newRoot.Invoke("AppCreate"true);
                
//tbEntry.Properties["DefaultDoc"][0] = "Default.aspx";//設置起始頁

                newRoot.Properties["AppFriendlyName"][0= virtualdir;   // 應用程序名
                newRoot.CommitChanges();
                root.CommitChanges();
            }

            
catch
            
{
                MessageBox.Show(
"虛擬目錄創建失??!""Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, 0
);
            }

        }

 再次生成看看,安裝時就可以看到輸入框了,數據庫的數據也是有效的了……

      這兩段代碼均是參考http://www.cnblogs.com/nerocool/archive/2008/08/13/1266733.html 
 

      這里只是簡單說了一下,還有些功能就沒提,像修改注冊表了(c/s用的比較多),添加桌面快捷方式,添加到快速啟動欄等等,這些自己都去試試,對著那些項點擊右鍵看看都有什么,都是什么,多摸索摸索……

      最后再給個鏈接:
http://blog.csdn.net/superes/archive/2009/03/16/3994939.aspx  介紹了3
種把數據庫附件到安裝程序里的,務必試試,剛我給的代碼中只是見了個空庫,沒有表……

 ---------2009-10-29-----   

   對創建虛擬目錄的代碼加以修改,主要原因是按照原先的代碼發布后,IIS中ASP.NET的版本是1.1.4322,這樣是無法訪問的,需要改成2.0.50727,在網上搜索之后,用”ASP.NET IIS注冊工具“可以實現,下面就多加了修改的代碼(搜到網上的還是1.1的,后來改成2.0的了)

 /// <summary>
        
/// 創建虛擬目錄
        
/// </summary>

        void CreateVirtualDir()
        {
            
try

            {
                
string constIISWebSiteRoot = "IIS://" + this.Context.Parameters["IISServer"+ "/W3SVC/1/ROOT";
                MessageBox.Show(
"start"
);
                DirectoryEntry root 
= new
 DirectoryEntry(constIISWebSiteRoot);          
                MessageBox.Show(
"no"
);
                DirectoryEntry newRoot 
= root.Children.Add(this.Context.Parameters["virtualdir"
], root.SchemaClassName);
             
//   newRoot.Properties["Path"][0] = @"D:\web";//設置物理地址

                newRoot.Properties["Path"][0= this.Context.Parameters["targetdir"];
                newRoot.Properties[
"AppIsolated"][0= 2;             // 值 0 表示應用程序在進程內運行,值 1 表示進程外,值 2 表示進程池

                newRoot.Properties["AccessScript"][0= true;          // 可執行腳本
                newRoot.Invoke("AppCreate"true);
                newRoot.Properties[
"DefaultDoc"][0= "Default.aspx";//設置起始頁

                newRoot.Properties["AppFriendlyName"][0= this.Context.Parameters["virtualdir"];   // 應用程序名
                newRoot.CommitChanges();
                root.CommitChanges();

                
//
修改IIS中asp.net版本
                
//用v2.0.50727下的aspnet_regiis.exe,網上給的都是v1.1.4,如果這樣就相當于沒改

                string fileName = Environment.GetEnvironmentVariable("windir"+ @"\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe";
                ProcessStartInfo startInfo 
= new
 ProcessStartInfo(fileName);
                
//處理目錄路徑

                string path = newRoot.Path.ToUpper();
                
int index = path.IndexOf("W3SVC"
);
                path 
= path.Remove(0
, index);
                
//啟動aspnet_iis.exe程序,刷新教本映射

                startInfo.Arguments = "-s " + path;
                startInfo.WindowStyle 
=
 ProcessWindowStyle.Hidden;
                startInfo.UseShellExecute 
= false
;
                startInfo.CreateNoWindow 
= true
;
                startInfo.RedirectStandardOutput 
= true
;
                startInfo.RedirectStandardError 
= true
;
                Process process 
= new
 Process();
                process.StartInfo 
=
 startInfo;
                process.Start();
                process.WaitForExit();
                
string errors =
 process.StandardError.ReadToEnd();
                
if (errors != string
.Empty)
                    
throw new
 Exception(errors);
             
//   Console.WriteLine(process.StandardOutput.ReadToEnd());

            }
            
catch
 (Exception ee)
            {
                MessageBox.Show(
"虛擬目錄創建失??!您可以手動創建! " + ee.Message, "Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, 0
);
            }

        }
創建web安裝項目的也試了,這次可以了,原因未知,不過我這次用的是2003系統,上次是2008的,創建虛擬目錄的代碼在2008下也無法運行,在03上就可以

web安裝項目好處是可以自動生成虛擬目錄,不用額外的添加代碼,但遇到的新問題是文件的安裝路徑沒法修改(沒有選擇路徑[瀏覽]的那個對話框)……網上也查到了個,說是用orca軟件修改 生成后的msi文件。

打 印】【關 閉

上一篇:如何識別 SQL Server 的版本
下一篇:15個值得開發人員關注的jQuery開發技巧和心得
相關新聞
版權所有©威課網 粵ICP備13058727號