Usuario
Ejecutar un programa externo sin que este termine los procesos

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); } } } }
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. -
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 -
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
-
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 -
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 55Dicha 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>