elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [SOLUCIONADO] Ejecutar recurso embedido del programa?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [SOLUCIONADO] Ejecutar recurso embedido del programa?  (Leído 4,793 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
[SOLUCIONADO] Ejecutar recurso embedido del programa?
« en: 17 Enero 2013, 07:26 am »

Tengo 4 recursos en mi APP:
Código:
Splitty_WinRar.exe
Splitty_7zip.exe
Default.SFX
rarreg.key

Al compilar el proyecto, los recursos se copian a la carpeta:
Código:
...\Debug\Resources\APPS\*
Y para ejecutar los exe debo usar un:
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? :-/


« Última modificación: 17 Enero 2013, 20:03 pm por EleKtro H@cker » En línea


kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.404


S3C M4NI4C


Ver Perfil
Re: Juntar un executable u otro archivo que no séa DLL al executable del programa?
« Respuesta #1 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
  1. Imports System.Reflection
  2. Module Module1
  3.  
  4.    Sub Main()
  5. 'Cargamos el ensamblado desde un archivo
  6. 'En tu caso podrias hacerlo desde los recursos del proyecto
  7.        Dim Ensamblado As Assembly = Assembly.LoadFile("C:\POC.exe")
  8. 'Apuntamos hacia el método de entrada, método principal que será llamado al ejecutarse el ensamblado
  9.        Dim EntryPoint As MethodInfo = Ensamblado.EntryPoint
  10. 'Lo invocamos pasandole un Array de Strings vacío ya que éste indica los Argumentos (args) y no le quiero pasar ninguno
  11.        EntryPoint.Invoke(Nothing, New Object() {New String() {}})
  12. 'Se ejecuta la PoC :)
  13.    End Sub
  14.  
  15. End Module

Saludos!


En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Juntar un executable u otro archivo que no séa DLL al executable del programa?
« Respuesta #2 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
  1.    Private Function Run_Process(ByVal Process_Name As String, Optional Process_Arguments As String = Nothing, Optional Read_Output As Boolean = False, Optional Process_Hide As Boolean = False)
  2.            Dim My_Process As New Process()
  3.            Dim My_Process_Info As New ProcessStartInfo()
  4.            bla bla bla
  5.            bla bla
  6.            My_Process.Start() ' Run the process NOW
  7.    end function

Y entonces en el código hago por ejemplo esto:
Código
  1. Run_Process(".\Apps\Splitty_winrar.exe", argumentos, false)

Como ves uso la ruta ".\apps\" así que la estructura del directorio de mi programa debe ser así:

Código:
.\Mi_Programa.exe
.\apps
.\apps\splitty_winrar.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
  1. Run_Process("Splitty_winrar.exe", argumentos, false)

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?
« Última modificación: 17 Enero 2013, 13:52 pm por EleKtro H@cker » En línea


Danyfirex


Desconectado Desconectado

Mensajes: 493


My Dear Mizuho


Ver Perfil
Re: Juntar un executable u otro archivo que no séa DLL al executable del programa?
« Respuesta #3 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
En línea

$Edu$


Desconectado Desconectado

Mensajes: 1.842



Ver Perfil
Re: Juntar un executable u otro archivo que no séa DLL al executable del programa?
« Respuesta #4 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.
En línea

kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.404


S3C M4NI4C


Ver Perfil
Re: Juntar un executable u otro archivo que no séa DLL al executable del programa?
« Respuesta #5 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
  1. Imports System.IO
  2. Module Module1
  3.   Dim ExePath As String = "C:\TempTCPOptimicer.exe"
  4.   Sub Main()
  5.         If Not File.Exists(ExePath) Then
  6. 'Obtenemos los Bytes del archivo a través de la lista de recursos
  7.         Dim Buffer As Byte() = My.Resources.TCPOptimizer
  8. 'Creamos un nuevo ejecutable en el que introduciremos los Bytes del archivo
  9.         Dim Fs As New FileStream(ExePath, FileMode.Create, FileAccess.Write)
  10.         Fs.Write(Buffer, 0, Buffer.Length)
  11.         Fs.Close()
  12. 'Ejecutamos el proceso temporal
  13.         Dim p As Process = Process.Start(ExePath)
  14. 'Activamos el evento Exited, que se encargará de manejar el cierre de la aplicación
  15.         p.EnableRaisingEvents = True
  16. 'Asociamos el evento Exited al método FileExitedEvent
  17.         AddHandler p.Exited, AddressOf FileExitedEvent
  18. 'No queremos que se cierra la instancia de la consola
  19.         Else
  20.         Console.WriteLine("El Archivo temporal {0} ya existe",ExePath)
  21.         End If
  22.     Console.Read()
  23.     End Sub
  24.  
  25.     Private Sub FileExitedEvent(ByVal sender As Object, ByVal e As EventArgs)
  26. 'Si has llegado hasta aquí es que el proceso finalizó
  27. 'Procedemos a eliminar el archivo temporal del disco
  28.         File.Delete(ExePath)
  29.     End Sub
  30. End Module

Saludos!
« Última modificación: 17 Enero 2013, 15:15 pm por kub0x » En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

seba123neo


Desconectado Desconectado

Mensajes: 3.621


"No quiero creer, quiero saber" - Carl Sagan


Ver Perfil WWW
Re: Juntar un executable u otro archivo que no séa DLL al executable del programa?
« Respuesta #6 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.
En línea

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Juntar un executable u otro archivo que no séa DLL al executable del programa?
« Respuesta #7 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
  1. Dim Buffer As Byte() = My.Resources.Splitty_7zip
  2. Dim Fs As New IO.FileStream(TempDir & "Splitty_7zip.exe", IO.FileMode.Create, IO.FileAccess.Write)
  3. Fs.Write(Buffer, 0, Buffer.Length)
  4. Fs.Close()

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!
En línea


seba123neo


Desconectado Desconectado

Mensajes: 3.621


"No quiero creer, quiero saber" - Carl Sagan


Ver Perfil WWW
Re: Juntar un executable u otro archivo que no séa DLL al executable del programa?
« Respuesta #8 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
  1. MsgBox(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData))

y yo no veo ninguno con guid.

En línea

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: [SOLUCIONADO] Ejecutar recurso embedido del programa?
« Respuesta #9 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!
« Última modificación: 17 Enero 2013, 21:00 pm por EleKtro H@cker » En línea


Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines