Título: [SOLUCIONADO] Ejecutar recurso embedido del programa? Publicado por: Eleкtro en 17 Enero 2013, 07:26 am Tengo 4 recursos en mi APP:
Código: Splitty_WinRar.exe Al compilar el proyecto, los recursos se copian a la carpeta: Código: ...\Debug\Resources\APPS\* Código: process.Start(".\Resources\APPS\Programa.exe") * Lo que quiero es no depender de esa carpeta llena de recursos. He intentado cambiar el tipo de recurso a "Resource", "Embeded resource", "Content", pero al hacerlo no encuentro la forma de ejecutar los EXE porque no encuentra la ruta (Están embedidos dentro del EXE) La ruta que utilizo en la CMD es la del directorio de trabajo principal: Código: process.Start(".\Programa.exe") Y también he probado a juntar los recursos con .NET Shrink e ILMerge, pero solo me permite juntar recursos en formato DLL... ¿Alguna ayuda? EDITO: Sería factible usar un Joiner para esto? :-/ Título: Re: Juntar un executable u otro archivo que no séa DLL al executable del programa? Publicado por: kub0x en 17 Enero 2013, 13:12 pm Lo que pides es embedir un ensamblado .NET dentro de otro. La clase Assembly te permite cargar ensamblados .NET en la memoria del programa y ejecutarlos en tiempo de ejecucción, sin tener que ejecutarlo en un proceso separado. Puedes escoger como vas a cargar el ensamblado, si está fuera del proyecto lo cargas como un archivo indicando la ruta. Lo normal sería añadirlo a los recursos del programa y cargarlo dinámicamente desde ahí mediante un Array de Bytes. El resto del trabajo es pan comido, solo tienes que llamar a su método de entrada, es decir, a Main().
Te dejo un fragmento de code, si lo quieres probar inicia un proyecto en modo consola y lo copias tal cual pero cambiando el path del ensamblado que quieres cargar :) Código
Saludos! Título: Re: Juntar un executable u otro archivo que no séa DLL al executable del programa? Publicado por: Eleкtro en 17 Enero 2013, 13:46 pm Tus respuestas son alucinantes Kubox (y dificiles),
pero de poco me va a servir, porque lo que quiero ejecutar es el Winrar y el 7zip, que no son ensamblados .NET... xD A ver, lo voy a explicar de otra manera... Hice una función para ejecutar procesos, con argumentos: Código
Y entonces en el código hago por ejemplo esto: Código
Como ves uso la ruta ".\apps\" así que la estructura del directorio de mi programa debe ser así: Código: .\Mi_Programa.exe Yo lo que quiero es embedir el "splitty_winrar.exe" dentro de "mi_programa.exe", para poder usar la función sin depender de la carpeta "apps", llamando al "splitty_winrar.exe" que está embedido dentro de mi programa.así: Código
Es decir, quiero que todo quede en un solo ejecutable distribuible, sin la carpeta "apps", y pudiendo usar la función. Eso ya lo he intentado, el EXE queda dentro de mi programa, como un recurso más, pero no funciona la orden, no encuentra el executable "splitty_winrar.exe". Ni siquiera sé si esto es posible hacerlo... ¿Alguna otra ayuda? Título: Re: Juntar un executable u otro archivo que no séa DLL al executable del programa? Publicado por: Danyfirex en 17 Enero 2013, 14:33 pm También podrías meterlos como una cadena y correrlos on the fly con algun "RunPE" que acepte parámetros. Bueno creo que eso se podria. ;D
Título: Re: Juntar un executable u otro archivo que no séa DLL al executable del programa? Publicado por: $Edu$ en 17 Enero 2013, 14:45 pm Me parece que tenes que sacarlo del recurso y luego ejecutarlo si o si, no puedes hacer eso de que se ejecute directamente del recurso, por lo menos yo nunca lo he hecho.
Por eso que mucha gente usa el directorio %temp% para dejar cosas ahi temporales y luego se borran cuando terminas tu app. Título: Re: Juntar un executable u otro archivo que no séa DLL al executable del programa? Publicado por: kub0x en 17 Enero 2013, 14:46 pm Advertencia - mientras estabas escribiendo, fueron publicadas 2 respuestas. Probablemente desees revisar tu mensaje.
Ahí me has pillado pues no he tenido experiencia en lo que se refiere a cargar código no administrado desde .NET . Se me ocurre que puedes embedir el ejecutable dentro de la lista de recursos y desde ahí crear un archivo temporal en el que escribes los Bytes del ejecutable embedido en recursos, ya que My.Resources."recurso" nos devolvería un Array de Bytes. Luego cuando cierras la App podrías llamar a una rutina que limpiara esos archivos temporales de la ruta donde los creaste, o bien, podrías eliminarlos cuando el proceso temporal finalice. A ver si alguien nos da algun consejo más práctico de como implementar esto. Lo que hago a continuación es cargar el TCPOptimicer desde un Array de Bytes de la lista de recursos. Creo un archivo temporal de éste, lo inicializo mediante la clase Process() y asocio el evento Exited de Process() a un método que será llamado cuando el archivo sea cerrado. Dentro de este método se ejecutará la instrucción de borrado del archivo temporal, de esta manera te libras del Process.WaitForExit(), recuerda, queremos rendimiento en nuestra aplicación. Código
Saludos! Título: Re: Juntar un executable u otro archivo que no séa DLL al executable del programa? Publicado por: seba123neo en 17 Enero 2013, 14:54 pm los cargas como recursos, y cuando lo quieras usar los escribis al disco y ejecutas, asi de facil.
en ves de hacerlo a la carpeta temp, podes ponerlos en la carpeta de appdata de tu aplicacion (por las dudas tengas problema de permisos). una ves que ya los pasas a esa carpeta no hace falta que lo pases de nuevo, para eso deberias chequear si existe antes de ecribirlo al disco de esa forma solo lo harias una sola ves. Título: Re: Juntar un executable u otro archivo que no séa DLL al executable del programa? Publicado por: Eleкtro en 17 Enero 2013, 19:44 pm @Seba
Te refieres a la carpeta de appdata donde se genera el "user.config"? Me gustaría hacer las cosas bien, pero creo que el nombre que se genera es aleatorio, como por ejemplo ".\roaming\Programa.exe_Url_ktb5duwkcuyoinv5ivsuakbcdmye00nf\user.config", ¿entonces como obtengo la ruta? ni siquiera sé si ese número es una GUID única, o que es. @Kubox Código
Te lo digo muy en serio, eres mi pu** ídolo, ¿diosss pero como lo haces para resolverlo todo!?, PD: Algunos no tenemos la suerte de aprender programación con un profesor en la uni :(. Desde luego eso de sacar los bytes va para mi colección de snippets/apuntes xD Un saludo! Título: Re: Juntar un executable u otro archivo que no séa DLL al executable del programa? Publicado por: seba123neo en 17 Enero 2013, 20:42 pm Te refieres a la carpeta de appdata donde se genera el "user.config"? Me gustaría hacer las cosas bien, pero creo que el nombre que se genera es aleatorio, como por ejemplo ".\roaming\Programa.exe_Url_ktb5duwkcuyoinv5ivsuakbcdmye00nf\user.config", ¿entonces como obtengo la ruta? ni siquiera sé si ese número es una GUID única, o que es. ahi guardan los datos y configuraciones las aplicaciones, por ejemplo, firefox guarda todo ahi. asi lo obtenes: Código
y yo no veo ninguno con guid. Título: Re: [SOLUCIONADO] Ejecutar recurso embedido del programa? Publicado por: Eleкtro en 17 Enero 2013, 20:58 pm Lo de obtener la ruta de APPDATA, y que los programas (suelen) guardan sus datos ahí, ya lo sabía, pero te lo agradezco.
Lo que pasa es que todos los programas que yo compilo (con settings) generan una carpeta en Local con una GUID o algo que parece ser una GUID, como en este ejemplo: Código: C:\Users\Administrador\AppData\Local\Microsoft\PlayDir.exe_Url_lnflzfdwlfhy5awswiu4l03ntux3k2vh\1.0.0.0\user.config por eso me parecía impredecible saber el nombre de esa carpeta a menos que hubiera algún método para obtener esa guid... pero por lo que dices parece que no xD. No sé, quizas es cosa del VS2012... EDITO: O del ILMerge o el .Net Shrink, ahora que lo pienso... ¿En la IDE se puede cambiar la ruta donde se almacena el archivo de configuración para quitarle la GUID? Un saludo! Título: Re: [SOLUCIONADO] Ejecutar recurso embedido del programa? Publicado por: seba123neo en 17 Enero 2013, 21:52 pm es que el visual studio guarda ahi automaticamente esas configuraciones.
aca te muestra bien el formato que se usa: Using My.Settings in Visual Basic (http://msdn.microsoft.com/en-us/library/ms379611%28VS.80%29.aspx) esa cadena larga no es un guid sino un hash (SHA1), o sea esto lo hace el visual studio y vos no podes hacer nada para evitarlo. igualmente es posible obtener ese path de esta forma, debes agregar la referencia a System.Configuration Código
igualmente yo hablaba de que vos crees ahi una carpeta, con el nombre que quieras para guardar tus cosas, de esa forma siempre podes saber el path. saludos. Título: Re: [SOLUCIONADO] Ejecutar recurso embedido del programa? Publicado por: Eleкtro en 18 Enero 2013, 07:48 am Código
¿Hay algo equivalente a eso para FW 3.0, 3.5, o 4.0? EDITO: ah pues... mmm... en Framework 4.5 tampoco me funciona xD Me dice que ConfigurationManager no está declarada Título: Re: [SOLUCIONADO] Ejecutar recurso embedido del programa? Publicado por: seba123neo en 18 Enero 2013, 13:38 pm yo lo uso en la 3.5, arriba puse debes agregar la referencia a System.Configuration
Título: Re: [SOLUCIONADO] Ejecutar recurso embedido del programa? Publicado por: Eleкtro en 18 Enero 2013, 13:43 pm ups perdón, a veces confundo importaciones con referencias :rolleyes:
ya me funciona, saludos. |