Asp.net程序打包发布问题集锦

收藏地址:http://uqqm.com/blog/blogview.asp?logID=15&cateID=2

[常见问题解答-安装和部署]错误: 无法生成项目输出组“内容文件来自WebApplication1(活动)” 
试试在“解决方案资源管理器”中,刷新目标项目,看看项目中有没有一些文件丢失(以感叹号标识,如下图所示),如果有,将所有这些文件补上或者“从项目中排除”,然后再重新生成安装包。

===================================================================================
项目打包总结

实现功能:根据用户自定义指定的数据库名及其他一些文件的安装如(iewebcontrols)

步骤:

新建一项目:visual C#项目  , 选中类库模板 ,如命名为myInstall,在此项目下面添加一新项:选择安装程序类(Installer1.cs),在此我采用默认名。此安装类库将实现数据库的安装及其他一些文件的安装。

在installer1.cs里我们将重写安装类的方法:见参考1

Install    Commit    Rollback      Uninstall

在install方法中来实现自定义的安装:

首先我们要得到一些用户变量(用户在安装时所做的操作,如数据库管理帐号等)

对于这些变量我们可以通过上下文环境来得到this.Context.Parameters["DataBaseName"];(在安装项目里将会进行设置)

在此我们一共得到五个变量。安装数据库的服务器,指定的数据库名,数据库管理员帐号,密码。以及数据库备份文件。

我们来看一下具体的代码,很简单:)

private void InstallDateBase()

{

System.Reflection.Assembly  Asm;

//                 Asm= System.Reflection.Assembly.GetExecutingAssembly();

//            System.IO.FileInfo FileInfo = new System.IO.FileInfo(Asm.Location);

//            也可以得到当前安装的目录,如wwwroot目录下myweb/你的安装工程名.dll

//下面是进行数据库连线及命令

              SqlConnection sqlConnection1 = new SqlConnection();

              string DBName = this.Context.Parameters["DataBaseName"];

              string DBServer = this.Context.Parameters["ServerName"];

              string DBUser = this.Context.Parameters["InStallAdmin"];

              string DBKey = this.Context.Parameters["InstallPassword"];

              string dir=this.Context.Parameters["dir"];

              

              StreamWriter ss=new StreamWriter(@"c:/aaa.txt",true);

              ss.WriteLine("data source=" + DBName + ";database=master;uid=" + DBUser +";password=" + DBKey);

              ss.Close();

              string CONSTR = "data source=" + DBServer +";database=master;uid=" + DBUser +";password=" + DBKey;

              sqlConnection1.ConnectionString =  CONSTR;

              //数据库将安装到system32下

              string CurDir = Directory.GetCurrentDirectory() + @"/TestData/database";

              if(!Directory.Exists(CurDir))//不存在就新建一个

              {

                   Directory.CreateDirectory(CurDir);

              }

              string MSQL = "RESTORE DATABASE " + DBName +

                   " FROM DISK = '" + dir + @"/database/myDataBase.bak' " +

                   " WITH MOVE 'myDate_dat' TO '" + CurDir + @"/" + DBName + ".mdf', " +

                   " MOVE 'myDate_log' TO '" + CurDir + @"/" + DBName + ".ldf' " ;

 

              SqlCommand cmd = new SqlCommand(MSQL,sqlConnection1);

              cmd.Connection.Open();

              cmd.ExecuteNonQuery();

              cmd.Connection.Close();

              if(sqlConnection1.State == ConnectionState.Open)

              {

                   sqlConnection1.Close();

              }

              //安装TreeView

              ProcessStartInfo psi = new ProcessStartInfo();

              psi.WorkingDirectory = dir+"//database";

              psi.FileName = dir + @"/database/iewebcontrols.msi ";

              psi.UseShellExecute=true; //msi文件,如是exe不用设

              

              Process.Start(psi);

              

//有哪位兄弟帮忙看一下。下面的代码。在执行时会说有一个进程在运行,导致安装这些控件时无法运行。一定要关了。才可以.但是下面的代码比上面的代码有一点好处,下面的进程等到结束后继续整个install方法的其他代码。而上面的代码,在实际运行时,整个安装已结束了。而安装TreeView的工作才刚开始。有点不同步

//            System.Diagnostics.Process myproc=new System.Diagnostics.Process();

//            myproc.EnableRaisingEvents=true;

//       

//            string file=dir+@"/database/iewebcontrols.msi";

//       

//            myproc.StartInfo.UseShellExecute=true;

//            myproc.StartInfo.FileName = file;

//            myproc.Start();

//            myproc.WaitForExit();//此方法可以无限期等到进程运行完成,才执行下面的代码

//            if(myproc.HasExited==true)

//            {

//                 //   myproc.Kill();

//            

//            }

}

public override void Install(System.Collections.IDictionary stateSaver)

        {

            try

            {

                base.Install(stateSaver);

              this.InstallDateBase();//调用上面的方法

}

catch

{

     throw;

}

}

public override void Uninstall(System.Collections.IDictionary stateSaver)

        {

            

            base.Uninstall(stateSaver);

            

            //UnInstallDataBase();

 

                

        }

 

        public override void Commit(System.Collections.IDictionary stateSaver)

        {

            base.Commit(stateSaver);

        }

 

        public override void Rollback(System.Collections.IDictionary stateSaver)

        {

            base.Rollback(stateSaver);

 

      

           

        }

 

参考1:

ms-help://MS.VSCC/MS.MSDNVS.2052/Vbcon/html/vbtskoverridingdefaultmethodsoninstallationcomponent.htm

ms-help://MS.VSCC/MS.MSDNVS.2052/vsintro7/html/vxwlkWalkthroughUsingCustomActionToCreateDatabaseDuringInstallation.htm

 

现在我们再此工程下面添加一个新的项目

安装和部署项目,选中web 项目模板,如命名为websetup2.

 

创建部署项目 

在“文件”菜单上,选择“添加项目”->“新建项目”。 
在“添加项目”对话框中,选择“项目类型”窗格中的“安装和部署项目”,然后选择“模板”窗格中的“WEB安装项目”。在“名称”框中,键入 websetup2。(我是默认的,没改。这些语句懒得打,抄来的,:)) 
在“属性”窗口中,选择 ProductName 属性并键入 mywebTest。 
在文件系统编辑器中,选择“应用程序文件夹”。在“操作”菜单上,选择“添加”->“项目输出”。 
在“添加项目输出组”对话框中,为“myInstall”项目选择主输出。 
 

在前面的操作与一般打包一样,将你的WEB工程里的一些文件添加进来。及一些其他打包设置(产品名等),我就不多说了。

我们这里仅仅要加入一个数据库备份文件(myDataBase.bak)

首先打开websetup2的文件系统窗口,选中web应用程序文件夹,在此文件夹下面添加一个文件夹我们用来存放数据库,如database,再将mydatabase.bak文件复制到此目录下面。

现在我们要添加一个安装时的窗口,用来让用户输入数据库帐号等。我们只要打开用户界面窗口就可以进行操作了。

 

创建自定义安装对话框 

在解决方案资源管理器中选择“websetup2”项目。在“视图”菜单上指向“编辑器”,然后选择“用户界面”。 
在用户界面编辑器中,选择“安装”下的“启动”节点。在“操作”菜单上,选择“添加对话框”。 
在“添加对话框”对话框中选择“文本框 (A)”对话框。 
在“操作”菜单上选择“上移”。重复此步骤,直到“文本框 (A)”对话框位于“安装文件夹”节点之上。 
在“属性”窗口中,选择 BannerText 属性并键入 自定义数据库安装 
选择 BodyText 属性并键入自定义数据库安装 
选择 Edit1Label 属性并键入服务器名:。 
选择 Edit1Property 属性并键入 SERVERNAME。 
选择 Edit2Label 属性并键入创建数据库名:。 
选择 Edit2Property 属性并键入 DATABASENAME。 
选择 Edit3Label 属性并键入数据库管理员帐号:。 
选择 Edit3Property 属性并键入 INSTALLADMIN。 
选择 Edit4Label 属性并键入管理员密码:。INSTALLPASSWORD 
选择 Edit4Property 属性并键入 SERVERNAME。
 

创建自定义操作 

在解决方案资源管理器中选择“websetup2”项目。在“视图”菜单上指向“编辑器”,然后选择“自定义操作”。 
在自定义操作编辑器中选择“安装”节点。在“操作”菜单上,选择“添加自定义操作”。 
在“选择项目中的项”对话框中,双击“应用程序文件夹”。 
选择“主输出来自 DBCustomAction(活动)”项。 
在“属性”窗口中,选择 CustomActionData 属性并键入 /InstallPassword=[INSTALLPASSWORD] /InStallAdmin=[INSTALLADMIN] /ServerName=[SERVERNAME] /DataBaseName=[DATABASENAME] /dir="[TARGETDIR]/"
注意各个 用户数据之间是有空格的。如/aaa=[fdfad] /bfff=[fdafdfd]

在“生成”菜单上选择“生成websetup2”。 
上面的customActionData将会在安装类中引用的。注意各个之间一定要有空格。

/dir=[“TARGETDIR”],取的是最终安装的WEB目录

到此一个项目打包就此结束了


==================================================================================
为什么一定要用Installsheld打包ASP.NET,直接用vs2003自带的工具不是更好吗?
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
private void InstallDateBase()
{
SqlConnection sqlConnection1 = new SqlConnection();
string DBName = this.Context.Parameters["DataBaseName"];
string DBServer = this.Context.Parameters["ServerName"];
string DBUser = this.Context.Parameters["InStallAdmin"];
string DBKey = this.Context.Parameters["InstallPassword"];
string dir=this.Context.Parameters["dir"];
              
create_install_log("安装参数取的成功");
string CONSTR = "data source=" + DBServer +";database=master;uid=" + DBUser +";password=" + DBKey;
sqlConnection1.ConnectionString =  CONSTR;
string MSQL = "RESTORE DATABASE " + DBName +
" FROM DISK = '" + dir + @"/database/OA_DATA.BAK' " ;
SqlCommand cmd = new SqlCommand(MSQL,sqlConnection1);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
if(sqlConnection1.State == ConnectionState.Open)
{
sqlConnection1.Close();
}
create_install_log("数据库创建成功");
// 修改web.config
string web_dir=dir + @"/web.config";
System.IO.FileInfo fileinfo=new FileInfo(web_dir);
if (fileinfo.Exists==false)
{
throw new InstallException("没有找到配置文件");
}
else 
{
create_install_log("配置文件查找成功");
}
System.Xml.XmlDocument xm = new System.Xml.XmlDocument(); 
xm.Load(fileinfo.FullName); 
System.Xml.XmlNodeList xnl=xm.SelectSingleNode("/configuration/appSettings").ChildNodes ;
foreach (System.Xml.XmlNode node in xnl )
{
System.Xml.XmlElement xe=(XmlElement)node;
if (xe.GetAttribute("key").IndexOf("strConnection")!=-1)
{
xe.SetAttribute("value","server="+DBServer+ " ;uid=" + DBUser +" ;password=" + DBKey+" ;database="+DBName);
xm.Save(web_dir);
create_install_log("配置文件修改成功");
break;
}
}
//安装sql脚本
string execsql;
execsql="/U "+DBUser+" /P "+DBKey+" /d "+DBName+ " /i "+ dir + @"database/SQLServerAgent_job.sql";
System.Diagnostics.Process sqlprocess=new System.Diagnostics.Process ();
sqlprocess.StartInfo.FileName="osql.exe ";
sqlprocess.StartInfo.Arguments=execsql;
try
{
sqlprocess.Start();
sqlprocess.WaitForExit();
sqlprocess.Close() ;
this.create_install_log("脚本安装成功");
System.IO.FileInfo fl=new FileInfo(dir + @"database/SQLServerAgent_job.sql");
if (fl.Exists)
{
fl.Delete();
}
}
catch
{
throw new InstallException("安装脚本失败,请检查SQLServerAgent是否运行");
}
//安装TreeView
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
psi.WorkingDirectory = dir+"//database";
psi.FileName = dir + @"/database/iewebcontrols.msi ";
psi.UseShellExecute=true; //msi文件,如是exe不用设
System.Diagnostics.Process.Start(psi);
}
public override void Install(IDictionary stateSaver)
{
try
{
base.Install (stateSaver);
this.InstallDateBase();
}
catch
{
throw;
}
}
public override void Uninstall(IDictionary savedState)
{
base.Uninstall (savedState);
}
public override void Commit(IDictionary savedState)
{
base.Commit (savedState);
}
public override void Rollback(IDictionary savedState)
{
base.Rollback (savedState);
}
private void create_install_log(string message)
{
StreamWriter ss=new StreamWriter(@"c:/OA软件安装日志.txt",true);
ss.WriteLine(System.DateTime.Now.ToString()+":"+message);
ss.Close();
}
}
}

####################################################################################
步骤: 
1、添加一个新项目->选择类库模板->命名为DBCustomAction 
2、单击项目右键->添加新项->选择安装程序类(命名为DBCustomAction.cs) 
3、在服务器资源管理器中添加->连接到数据库->指定用户密码(选择允许保存密码)->数据库选择master 
4、切换到DBCustomAction.cs的视图状态->将服务器资源管理器数据库连接中的master.dbo拖动到designer中 
5、添加一个新项sql.txt(注意要使用小写),输入下列sql代码 
CREATE TABLE [dbo].[MK_Employees] ( 
[Name] [char] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , 
[Rsvp] [int] NULL , 
[Requests] [nvarchar] (4000) COLLATE SQL_Latin1_General_CP1_CI_AS NULL  
) ON [PRIMARY]; 

ALTER TABLE [dbo].[MK_Employees] WITH NOCHECK ADD  
CONSTRAINT [PK_MK_Employees] PRIMARY KEY CLUSTERED  

[Name] 
) ON [PRIMARY]; 
(P.S:也可以直接用SqlServer导出) 

6、在sql.txt的右键属性中->生成操作->嵌入的资源 
7、将DBCustomAction.cs切换到代码视图,添加下列代码 
private  string GetSql(string Name) 
      { 
         try 
         { 
            Assembly Asm = Assembly.GetExecutingAssembly(); 
            Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "."+Name); 
            StreamReader reader = new StreamReader(strm); 
            return reader.ReadToEnd(); 
         } 
         catch (Exception ex) 
         { 
            Console.Write("In GetSql:"+ex.Message); 
            throw ex; 
         } 
      } 

      private void ExecuteSql(string DataBaseName,string Sql) 
      { 
         System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand(Sql,sqlConnection1); 

         Command.Connection.Open(); 
         Command.Connection.ChangeDatabase(DataBaseName); 
         try 
         { 
            Command.ExecuteNonQuery(); 
         } 
         finally 
         { 
            Command.Connection.Close(); 
         } 
      } 


      protected void AddDBTable(string strDBName) 
      { 
         try 
         { 
            ExecuteSql("master","CREATE DATABASE "+ strDBName); 
            ExecuteSql(strDBName,GetSql("sql.txt")); 
         } 
         catch(Exception ex) 
         { 
               Console.Write("In exception handler :"+ex.Message); 
         } 
      } 

      public override void Install(System.Collections.IDictionary stateSaver) 
      { 
          base.Install(stateSaver); 
             AddDBTable(this.Context.Parameters["dbname"]); 
      } 


8、再添加一个新项目,(选择添加到解决方案中)->项目类型为安装项目->命名为DBCustomAction Installer 
9、选择应用程序文件夹->添加->项目输出->主输出 
10、在方案资源管理器中->右键安装项目(DBCustomAction Installer)->视图->用户界面 
11、选中启动结点->添加对话框->文本A 
12、选动文本框A->右键->上移一直到最顶端 
13、选择文本框A属性->修改BannerText,(Specify Database Name) 
14、修改BodyText(This dialog allows you to specify the name of the database to be created on the database server. ) 
15、修改EditLabel1(Name of DB),修改Edit1Porperty(CUSTOMTEXTA1),将其他Edit2,3,4的Edit(2,3,4)Visible属性设为false; 
16、在方案资源管理器中->右键安装项目(DBCustomAction Installer)->视图->自定义操作 
17、选中安装结点->添加->双击应用程序文件夹->主输出来自DBCustomAction(活动)->右键属性->CustomActiveData属性修改为/dbname=[CUSTOMTEXTA1] 
18、编译生成,OK! 

注:此文章主要来自于MSDN,本来代码使用vb.net,我用C#改写了一下,完整URL请参考 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsintro7/h ... mActionToCreateDatabaseDuringInstallation.asp 
另外没有接受客户数据库服务Server-Name和Password的对话框,我想既然可以接受DBNAME参数,那么接收Server-Name和Password应该也不难.  
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

asp.net打包过程详解
--------------------------------------------------------------------

 如果您是使用vs.net开发程序,您可以用vs.net中的web setup project来生成安装包来帮助您
发布您的asp.net程序. 其大致使用步骤如下:

1.假定您已经有了一个名为webapp1的web application工程,并已在vs.net中打开.

2.在vs.net中,在菜单上选择file->project.在new project对话框的左边选setup and deployment projects,右边选web setup project模版.指定其name和location.(例如name为webdeploy.)选择add to solution.然后选择ok.

3.在solution explorer中,右击webdeploy工程.然后在弹出的菜单上选add->project output.确认webapp1在project下拉框中被选中.

4.选中primary output和content files选项,然后点ok.

5.在file system editor中,选web application文件夹,然后在properties窗口中,设定virtualdirecoty属性和defaultdocument属性.

6.然后在菜单上选build->build webdeploy.

7.最后,在您第2步的location指定的路径下可以找到生成的setup.exe和.msi及其它相关文件,可以用于向其它机器发布该asp.net程序.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值