none
C# - executar Process em modo sincrono RRS feed

  • Pergunta

  • Olá estou tentando executar um setup.exe gostaria que após finalizar a execução do setup.exe fosse fechado o form que chamou a execução usando:

            private void InstallSistema()
            {
                Process setup = new Process();
                setup.StartInfo.FileName = "setup.exe";
                setup.StartInfo.UseShellExecute = false;
    
                setup.Exited += new EventHandler(setup_Exited);
                setup.EnableRaisingEvents = true;
    
                setup.Start();
                Close();  
            }
    
            void setup_Exited(object sender, EventArgs e)
            {
                Close();
            }


    Mas o evento Exited do processo é chamado antes de terminar a execução do setup.exe o que gera um erro ao tentar executar Close(). Alguém tem uma idéia de como posso fazer isto?
    Paulo Moreira
    quarta-feira, 17 de março de 2010 15:54

Respostas

  • Bom dia, então já faz um tempo que mandei este post, mas atualmente estou usando o visual studio 2008 e eu to fazendo da seguinte forma:

    Tenho 3 projetos, um que instala o sql server express 2005,  um que possui uma classe que herda a classe Installer e é usada para configurar a minha instância do banco instalado e outro que copia os arquivos do meu sistema para a máquina do usuário e chama a classe installer por meio de uma customAction. Este último é um projeto do tipo Setup Project.

     

    No projeto que instala o sql server express deixei sem nenhum formulário e coloquei todo o código dentro do arquivo program porque deste modo o código executa e não precisa fechar nenhum formulário. Então neste projeto eu tenho uma função que instala o banco e em seguida chama o .exe resultante do projeto setup project. O código para isto fico +- assim:

      static class Program
      {
        /// <summary>
        /// Programa que instala o banco de dados sql server express 2005.
        /// </summary>
        [STAThread]
        static void Main()
        {
          Application.EnableVisualStyles();
          Application.SetCompatibleTextRenderingDefault(false);
    
          InstalaExpress();
          InstalarSistema();
    
        }
    
        private static void InstalarSistema()
        {
          Process setup = new Process();
          setup.StartInfo.FileName = "setup2.exe";
          setup.StartInfo.UseShellExecute = false;
          setup.EnableRaisingEvents = false;
          setup.Start();
          setup.WaitForExit();
        }
    
      }
    O setup2.exe então copia os arquivo do meu sistema para o destino da instalação e chama uma DLL, resultante do projeto que possui uma classe Installer, que configura o banco de dados.

     

    abraço

    Paulo Moreira


    Paulo Moreira
    • Marcado como Resposta paulo3011 sexta-feira, 4 de junho de 2010 12:58
    sexta-feira, 4 de junho de 2010 12:56

Todas as Respostas

  • Depende do setup, tbém tive este problema o setup criava outro processo e fechava o processo que eu iniciava, dai eu não conseguia saber quando o setup terminava de verdade.

    Só mais uma coisa, no Close() vc faz o que?


    Se sua pergunta foi respondida por favor marque a resposta como certa.
    sexta-feira, 9 de abril de 2010 22:37
  • Paulo,

    Conseguiu resolver seu problema?


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    quinta-feira, 6 de maio de 2010 23:25
    Moderador
  • Bom dia, então já faz um tempo que mandei este post, mas atualmente estou usando o visual studio 2008 e eu to fazendo da seguinte forma:

    Tenho 3 projetos, um que instala o sql server express 2005,  um que possui uma classe que herda a classe Installer e é usada para configurar a minha instância do banco instalado e outro que copia os arquivos do meu sistema para a máquina do usuário e chama a classe installer por meio de uma customAction. Este último é um projeto do tipo Setup Project.

     

    No projeto que instala o sql server express deixei sem nenhum formulário e coloquei todo o código dentro do arquivo program porque deste modo o código executa e não precisa fechar nenhum formulário. Então neste projeto eu tenho uma função que instala o banco e em seguida chama o .exe resultante do projeto setup project. O código para isto fico +- assim:

      static class Program
      {
        /// <summary>
        /// Programa que instala o banco de dados sql server express 2005.
        /// </summary>
        [STAThread]
        static void Main()
        {
          Application.EnableVisualStyles();
          Application.SetCompatibleTextRenderingDefault(false);
    
          InstalaExpress();
          InstalarSistema();
    
        }
    
        private static void InstalarSistema()
        {
          Process setup = new Process();
          setup.StartInfo.FileName = "setup2.exe";
          setup.StartInfo.UseShellExecute = false;
          setup.EnableRaisingEvents = false;
          setup.Start();
          setup.WaitForExit();
        }
    
      }
    O setup2.exe então copia os arquivo do meu sistema para o destino da instalação e chama uma DLL, resultante do projeto que possui uma classe Installer, que configura o banco de dados.

     

    abraço

    Paulo Moreira


    Paulo Moreira
    • Marcado como Resposta paulo3011 sexta-feira, 4 de junho de 2010 12:58
    sexta-feira, 4 de junho de 2010 12:56