之前提出过两个类似的问题,都没有得到满意的答复,http://topic.csdn.net/u/20101017/16/2bc756ba-fc36-4a8d-95ab-15831e460528.html?1689388944

http://topic.csdn.net/u/20101015/09/88fe5c04-61c8-4ef1-9da8-921eb69e42a9.html根据微软的帮助,制作了继承与Installer类的一个自动运行的类,如下:using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.Windows.Forms;namespace StartProgram
{
    [RunInstaller(true)]
    public partial class AutorunInstaller : System.Configuration.Install.Installer
    {
        public AutorunInstaller()
        {
            InitializeComponent();
        }        public override void Install(System.Collections.IDictionary stateSaver)
        {
            base.Install(stateSaver);
        }        public override void Commit(IDictionary savedState)
        {
            base.Commit(savedState);
            // 在安装完毕后,运行刚刚安装的程序M.exe
            //MessageBox.Show("Complete-- Commit");
            string myInput = Context.Parameters["CHECKBOXA1"];
            bool bChecked = true;
            //if (myInput == "Checked")
            //{
            //    bChecked = true;
            //}
            //MessageBox.Show(myInput);
            if (bChecked == true)
            {
                string exe_path = @"C:\Program Files\M\";
                System.Diagnostics.Process process = new System.Diagnostics.Process();
                process.StartInfo.FileName = "M.exe";
                process.StartInfo.WorkingDirectory = exe_path;
                process.StartInfo.CreateNoWindow = true;
                process.Start();
                //if (process.HasExited)
                //{
                //    MessageBox.Show("complete");
                //}
            }
        }
现在的问题是:在弹出结束安装窗口之前的确能够起到M.exe,但是,在启动M之后安装结束窗口仍然存在,
也就是说安装程序和M同时存在了,在M打开后,还需手动去关闭安装程序的最后一个结束窗口。1)、有什么办法可以在安装程序的最后一个窗口关闭之后再打开M?尝试放在
protected virtual void OnAfterInstall(IDictionary savedState);
里启动,但是好像根本没反应,似乎没有执行到这里一样,
2)、不知为什么?

解决方案 »

  1.   

    有时间的话研究下wix下吧,解决这个问题很简单,添加一个Custom Action,几行xml标记就可以,不用写任何c#代码;最近我刚好把相关的资料整理了一下,不过还没写完,有兴趣可以参考:http://blog.csdn.net/duanzilin/archive/2010/10/19/5951863.aspx
      

  2.   

    Installer类编译后,需要在安装程序的自定义操作中的安装选项中添加进来。这样Installer中的事件才会触发。另外即使在OnAfterInstall事件中写启动程序,这个时候安装程序最后一步退出仍然没有执行,界面还是存在的。解决方法未知。期待做过的大虾提示
      

  3.   

    wix是免费的吗?用于商业用途哦,
      

  4.   

     在创建的类中加入重载代码:
         public  override void Install(System.Collections.IDictionary stateSaver)
             {//重写install方法   
                System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();    
                string setuppath=asm.Location;//获取程序路径
                if( System.IO.File.Exists(setuppath))
                System.Diagnostics.Process.Start(setuppath);//启动程序
             } 
    然后, 在你建立的打包项目中,在custom action(自定义操作)中的安装上点右键新建,选择你的启动程序,应该就可以了。
      

  5.   


    放心吧,wix是完全免费的,它是微软根据windows installer使用c#开发的一个打包工具,完全兼容vs
      

  6.   


    windows installer本身就带有启动应用程序的Action,完全不用再写Action来实现的,但是vs自带的打包应该很难实现这种效果;如果自己写Action也不容易实现,因为所有的Action(包括自定义的Action)都包含在InstallExecuteSequence或者InstallUISequence序列中,这些序列都在ExitDialog(结束界面)调用之前就执行完了,所以要在最后执行程序,我们必须把Action绑定到完成按钮的事件上,使用wix或者直接编辑msi可以达到这种效果,下面是直接编辑msi实现方法:1、首先下载orca,它是msi数据库编辑工具。
    2、使用orca打开msi文件,在Tables列表中找到CustomAction表,添加新行如下:
    Action         Type     Source...    
    LaunchFile     210      FoobarEXE
    Source字段值就是你执行文件的名称,它是File表的外键,必须跟File表中File列的值对应
    3、找到ControlEvent表,添加新行:
    Dialog       Control    Event       Argument     Condition    Order
    ...
    ExitDialog    Finish    DoAction    LaunchFile    1            2
    4、保存修改后的msi文件,就大功告成了,此方式已测试,绝对可行

      

  7.   

    有点大意了,之前回复中我用的还是wix的安装界面,发现vs打包的程序最后的界面不是ExitDialog,而是FinishedForm,因此需要上面ControlEvent表添加的记录修改为如下:
    Dialog Control Event Argument Condition Order
    ...
    FinishedForm CloseButton DoAction LaunchFile 1 2以上是用vs打包后测试通过
      

  8.   

    你就不能学下其他软件么
    弄一个checkbox,Text就是 安装结束启动程序
    打钩的话 安装完毕点关闭 就启动程序啊 这样不就可以了
      

  9.   

    安装完毕后怎么是个Microsoft Platform SDK for Windows Server 2003 SP1?
    而且根本无法发现你说的orca(用来打开msi的工具)
    我的是winxp
      

  10.   


    多谢你,现在在FinishedForm 中点击CloseButton后是可以打开安装的程序,但是,FinishedForm自己关闭不了?不知道该怎么关闭?
      

  11.   


    奇怪,我这里都可以关掉的……确定一下ControlEvent表的记录,Dialog字段值为FinishedForm的记录应该有两条,其中一条的Event值是EndDialog,也就是关闭窗口,另一条就是我们添加的Event值是DoActionFinishedForm CloseButton EndDialog Return 1 0
    FinishedForm CloseButton DoAction LaunchFile 1 2
      

  12.   

    检查下是不是因为之前Installer类的原因导致不能关闭,你重新做个干净的安装包,然后安装一遍,确定是否能关闭结束窗口,确定没问题然后按我的方法再做一遍,应该就可以了
      

  13.   

    的确可以关掉,是我误解你的意思了,原来以为直接改
    FinishedForm CloseButton EndDialog Return 1 0

    FinishedForm CloseButton DoAction LaunchFile 1 2
    !!!
    原来是二者并存!!现在可以了,
      

  14.   

    不过,这样有一个不方便的地方:每次生成安装包后都需要用Orca来修改一下!!!
      

  15.   


    没办法只能这样了,你可以最终发布的时候再去改msi文件,用vs打包有它的局限性,如果使用wix就不会出现这样情况了
      

  16.   

    是想用wix来着,但是看了一下帮助,感觉用着很别扭,
    可能是用惯UI了,
      

  17.   

    呵呵,可能你还不习惯xml编程,其实wix安装后就集成到vs中了,可以在vs下创建和编译wix项目,熟练后比vs打包更方便