none
Ejecutar un programa externo sin que este termine los procesos RRS feed

  • Pregunta

  • Buenas foro,

              Estoy realizando una aplicación de consola que ejecuta un ejecutador externo, el problema que al hacer la instalación esta termina los demas procesos que deben correr una vez instalada la aplicacion... tengo varias rutas estaticas ya que la instalación debiese correr de forma silenciosa sin logro alguno y no comprendo porque una vez que se ejecuta termina los demas procesos del sistema ademas de no saber en que carpeta se instalaria, es posible una ayuda sobre el tema, adjunto mi codigo.

    class Program
        {
            private static Computer mycomputer = new Computer();
            static void Main(string[] args)
            {
                ///Ejecuta el instalador de Quick Capture
                Process p = new Process();
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.FileName = "QuickCapture Desktop.exe";
                p.StartInfo.Arguments = "/quiet";
                p.Start();
                ///Termino de la instalacion
    
                ///Carpeta de origen y destino
                ///Carpeta original desde el ejecutable buscar ruta relativa
                ///Carpeta de archivos XML
                string folderXML = @"Recursos\xml";
                ///Carpeta de imagenes
                string folderImages = @"Recursos\Images";
                string destinationFolder = @"C:\Program Files (x86)\NSI\QuickCapture";
                string[] xmlfile = Directory.GetFiles(destinationFolder);
                //string[] datafile = Directory.GetFiles(sourceFolder);
                string[] nsi = new string[] { "QCD_1024X768.XML", "QCD_Desk.xml", "QCD_STR.XML" };
                string originalFolder = @"C:\Program Files (x86)\NSI\QuickCapture\Images";
                string copiaFolder = @"C:\Program Files (x86)\NSI\QuickCapture\Images_1";
                TimeSpan interval = new TimeSpan(0, 3, 0);
    
                for (int i = 0; i < 10; i++)
                {
                    if (Directory.Exists(destinationFolder))
                    {
                        if (Directory.Exists(copiaFolder))
                        {
                            ///Eliminar copia ya modificada
                            Directory.Delete(copiaFolder, true);
                            ///Renombrar carpeta de imagenes
                            mycomputer.FileSystem.RenameDirectory(originalFolder, "Images_1");
                        }
                        
                        
                        ///
                        if (!Directory.Exists(originalFolder))
                        {
                            //Crear el nuevo directorio de archivos
                            Directory.CreateDirectory(originalFolder);
                            if (Directory.Exists(originalFolder))
                            {
                                //Crear archivos desde origen
                                DirectoryInfo dir = new DirectoryInfo(folderImages);
                                DirectoryInfo[] dirs = dir.GetDirectories();
                                FileInfo[] files = dir.GetFiles();
                                foreach (FileInfo f in files)
                                {
                                    string temppath = Path.Combine(originalFolder, f.Name);
                                    f.CopyTo(temppath, false);
                                }
                            }
                            ///Renombrar archivos XML
                            foreach (string h in xmlfile)
                            {
                                if (File.Exists(h))
                                {
                                    string nombreXML = Path.GetFileName(h);
                                    string nombreFile = System.IO.Path.GetFileNameWithoutExtension(h);
                                    foreach (string xml in nsi)
                                    {
                                        if (nombreXML == xml)
                                        {
                                            
                                            string nuevoFile = nombreFile + "_1.xml";
                                            string existeFile = Path.Combine(destinationFolder, nuevoFile);
                                            if (File.Exists(existeFile))
                                            {
                                                ///Eliminar archivo ya existente
                                                System.IO.File.Delete(existeFile);
                                                ///Renombrar archivos XML
                                                mycomputer.FileSystem.RenameFile(h, nuevoFile);
                                            }
                                            
                                            ///
                                            ///Copia de archivos desde origen
                                            string path = Path.Combine(folderXML, nombreXML);
                                            string pathdest = Path.Combine(destinationFolder, nombreXML);
                                            File.Copy(path, pathdest, true);
                                            ///
                                        }
                                    }
    
                                    
                                }
                            }
                        }
                        break;
                    }
                    else
                    {
                        Thread.Sleep(interval);
                    }
    
                }
    
            }
        }

    martes, 12 de marzo de 2019 16:01

Todas las respuestas

  • Hola  

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te comento que estaremos realizando una revisión a profundidad acerca del inconveniente que se te está presentando.

    Proporcionaremos una respuesta lo más pronto posible.

    Gracias por usar los foros de MSDN.

    Pedro Alfaro
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
    martes, 12 de marzo de 2019 18:31
    Moderador
  • hola

    >>el problema que al hacer la instalación esta termina los demas procesos que deben correr una vez instalada la aplicacion

    Como realizas la instalacion ? copias los archivos o usas alguna tool

    Quizas esta teniendo un Exception que no capturas con el try...catch, al fallar termina la ejecucion

    Lo que no entiendo en el codigo es porque realizas un

    for (int i = 0; i < 10; i++)

    Ademas si vas a avalidar si existe podrias usar

    if (!Directory.Exists(destinationFolder)) break;

    //resto codigo

    asi no necesitas poner el else al final de todo el codigo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 12 de marzo de 2019 18:31
  • La instalación del programa lo hago con el siguiente proceso y codigo

    ProcessStartInfo p = new ProcessStartInfo("QuickCapture Desktop.exe");
                p.WindowStyle = ProcessWindowStyle.Hidden;
                p.UseShellExecute = false;
                Process proc = Process.Start(p);
                proc.WaitForExit();

    Aunque el codigo aun asi me abre las ventanas del instalador sin ser de manera silenciosa, al terminar la instalacion con el proc.WaitForExit la instalacion una vez completada realiza las tareas desarrolladas en el codigo.

    Le agregue un app.manifest para poder utilizar la aplicación como administrador, aunque tengo problemas de autorizacion y mi codigo de reemplazo de archivos y copia no puede realizar las funciones

    for (int i = 0; i < 10; i++)
                {
                    if (Directory.Exists(destinationFolder))
                    {
    
                        Console.WriteLine(destinationFolder);
                        Console.ReadLine();
                        if (Directory.Exists(copiaFolder))
                        {
                            ///Eliminar copia ya modificada
                            Directory.Delete(copiaFolder, true);
                            mycomputer.FileSystem.MoveDirectory(originalFolder, copiaFolder);
                        }
                        else
                        {
                            mycomputer.FileSystem.MoveDirectory(originalFolder, copiaFolder);
                        }
    
    
                        /
                        if (!Directory.Exists(originalFolder))
                        {
                            Console.WriteLine(originalFolder);
                            Console.ReadLine();
                            //Crear el nuevo directorio de archivos
                            Directory.CreateDirectory(originalFolder);
                            if (Directory.Exists(originalFolder))
                            {
                                //Crear archivos desde origen
                                DirectoryInfo dir = new DirectoryInfo(folderImages);
                                DirectoryInfo[] dirs = dir.GetDirectories();
                                FileInfo[] files = dir.GetFiles();
                                foreach (FileInfo f in files)
                                {
                                    string temppath = Path.Combine(originalFolder, f.Name);
                                    f.CopyTo(temppath, false);
                                }
                            }
                            ///Renombrar archivos XML
                            foreach (string h in xmlfile)
                            {
                                if (File.Exists(h))
                                {
                                    string nombreXML = Path.GetFileName(h);
                                    string nombreFile = System.IO.Path.GetFileNameWithoutExtension(h);
                                    foreach (string xml in nsi)
                                    {
                                        if (nombreXML == xml)
                                        {
    
                                            string nuevoFile = nombreFile + "_1.xml";
                                            string existeFile = Path.Combine(destinationFolder, nuevoFile);
                                            if (File.Exists(existeFile))
                                            {
                                                ///Eliminar archivo ya existente
                                                ///Revisar por errores unautorized user
                                                File.Delete(existeFile);
                                                //mycomputer.FileSystem.DeleteFile(existeFile);
                                                ///Renombrar archivos XML
                                                mycomputer.FileSystem.RenameFile(h, nuevoFile);
                                            }
    
                                            ///
                                            ///Copia de archivos desde origen
                                            string path = Path.Combine(folderXML, nombreXML);
                                            string pathdest = Path.Combine(destinationFolder, nombreXML);
                                            File.Copy(path, pathdest, true);
                                            ///
                                        }
                                    }
    
    
                                }
                            }
                        }
                        break;
                    }
                    else
                    {
                        Thread.Sleep(interval);
                    }

    El break lo gestione para que una vez realizada las tareas de reemplazo y copia de archivos en la ruta seleccionada  saliera del ciclo del for

    martes, 12 de marzo de 2019 20:08
  • hola

    si defines el codigo dentro de un try...catch podrias ver si atrapas el mensaje de error

    quizas se deba a una ruta incorrecta

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 12 de marzo de 2019 20:42
  • Realice el try catch y me arroja la siguiente excepcion:

    System.UnauthorizedAccessException: Acceso denegado a la ruta de acceso '1_down.ico'.
       en System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive)
       en System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive)
       en Sodimac_Install.Program.Main(String[] args) en D:\Users\Nicolas\Documents\Visual Studio\Visual Studio 2017\Projects\Sodimac Install\Sodimac Install\Program.cs:línea 55​​

    Dicha solucion la di con un app.manifest

    <?xml version="1.0" encoding="utf-8"?>
    <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
      <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
          <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
            <!-- Opciones del manifiesto UAC
                 Si quiere cambiar el nivel del Control de cuentas de usuario de Windows reemplace el 
                 nodo requestedExecutionLevel por uno de los siguientes.
    
            <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
            <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
            <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
    
                Especificar el elemento requestedExecutionLevel deshabilitará la virtualización de archivos y registros. 
                Quite este elemento si la aplicación necesita esta virtualización para la compatibilidad
                con versiones anteriores.
            -->
            <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
          </requestedPrivileges>
        </security>
      </trustInfo>
    
      <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
          <!-- Una lista de las versiones de Windows en la que se ha probado esta aplicación y
               con la que se ha diseñado para que trabaje. Quite la marca de comentario de los elementos adecuados y Windows seleccionará 
               automáticamente el entorno más compatible. -->
    
          <!-- Windows Vista -->
          <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
    
          <!-- Windows 7 -->
          <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
    
          <!-- Windows 8 -->
          <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
    
          <!-- Windows 8.1 -->
          <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
    
          <!-- Windows 10 -->
          <!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
    
        </application>
      </compatibility>
    
      <!-- Indica que la aplicación tiene reconocimiento de PPP y Windows no la escalará de forma automática a
           PPP superiores. Las aplicaciones de Windows Presentation Foundation (WPF) tienen reconocimiento de PPP automático y no necesitan 
           participar. Las aplicaciones de Windows Forms que apuntan a .NET Framework 4.6 que participan en esta configuración, también 
           deben establecer la configuración 'EnableWindowsFormsHighDpiAutoResizing' en 'true' en app.config. -->
      <!--
      <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
          <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
        </windowsSettings>
      </application>
      -->
    
      <!-- Habilitar los temas para los controles y cuadros de diálogo comunes de Windows (Windows XP y versiones posteriores) -->
      <!--
      <dependency>
        <dependentAssembly>
          <assemblyIdentity
              type="win32"
              name="Microsoft.Windows.Common-Controls"
              version="6.0.0.0"
              processorArchitecture="*"
              publicKeyToken="6595b64144ccf1df"
              language="*"
            />
        </dependentAssembly>
      </dependency>
      -->
    
    </assembly>
    


    martes, 12 de marzo de 2019 21:26