Estuve haciendo unas pruebitas el fin de semana de cómo transferir un archivo ejecutable dentro de otro archivo ejecutable y a la vez, correrlo. Esto se hace mediante resources dentro de tu programa… les daré una visita guíada de como lograrlo:
embed
- Creamos un nuevo proyecto, en este caso esta bien un Windows Forms.
- Dentro del Solution Explorer, añade un nuevo Resources File.
- Dale doble-clic dentro del Resources File y te abre el diseñador de recursos.
- Haz click en Add Resource->Add Existing File.
- Busca el archivo en cuestión y añadelo a la colección de recursos. El archivo puede ser de cualquier tipo, para este ejemplo utiilizaremos un .exe.
- Al añadir el archivo, este aparecerá fisicamente dentro de tu proyecto; seleccionalo y modifica su propiedad Build Action como Embedded Resource. Esto es importante ya que si no lo hacemos el programa no encontrará el recurso.
extract
Ya tenemos listos los pasos para nuestro ejemplo, ahora lo que vamos a hacer es poner el código necesario para poder extrarlo. Veamos el siguiente código:
Tenemos que declarar a nivel de clase una variable privada que se le conozca como _assembly, la cual tendrá el ensamblado de donde queremos extraer el recurso. Sobre nuestra clase escribe:
private Assembly _assembly = Assembly.GetExecutingAssembly();
Después tenemos que obtener el nombre completo del recurso dentro del ensamblado, para eso creamos esta simple función que obtiene el nombre completo del recurso:
private string GetResourceName(string resourceName)
{
string _name = null;
foreach (string str in this._assembly.GetManifestResourceNames())
{
if (str.EndsWith(resourceName))
{
_name = str;
break;
}
Console.WriteLine(str);
}
return _name;
}
Ahora lo que necesitamos es extraer el recurso de la aplicación, para eso creamos otra función que se encarga de extraerlo:
public void ExtractToFile(string resourceFileName, string outFilename)
{
string fullName = this.GetResourceFullName(resourceFileName);
if (fullName == null)
throw new Exception(String.Format(«No existe {0} en la lista de recursos»,resourceFileName));try
{
Stream file = this._assembly.GetManifestResourceStream(fullName);
FileStream outFile = new FileStream(outFilename, FileMode.Create);
int bufferLen = 1024;
byte[] buffer = new byte[bufferLen];
int bytesRead;
do
{
bytesRead = file.Read(buffer, 0, bufferLen);
outFile.Write(buffer, 0, bytesRead);
} while (bytesRead != 0);
outFile.Close();
}
catch (Exception ex)
{
string msg = «Existió un error al intentar correr la instalación de Windows Live Toolbarn{0}»;
MessageBox.Show(String.Format(msg, ex.Message));
}
}
Ok, ya tenemos la función que nos obtiene el recurso dentro de la lista de recursos y la función que se encarga de extraer a un archivo el recurso incrustado. Ahora lo que tenemos que hacer es ejecutarlo.
run
Pon un botón dentro de la forma, en el cual escribiremos el siguiente código:
private void buttonClick(object sender, EventArgs e)
{
string filename = «Toolbar.exe»;
string outfilename = Path.Combine(Path.GetTempPath(), filename);ExtractToFile(filename, outfilename);
Process proc = new Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = outfilename;
proc.StartInfo.Arguments = «/Q»;
proc.Start();}
La primera parte obtiene el nombre del archivo .exe que añadimos dentro de nuestro recurso. Después mandamos a llamar la función ExtractToFile() con el nombre del recurso de entrada y el nombre del archivo de salida envíandolo al directorio Temp() del usuario actual.
Después creamos un proceso de shell (System.Diagnostics) y le pasamos las propiedades para ejecutarlo.
Listo.
Ya tenemos un archivo incrustado dentro de otro ejecutable para su ejecución en tiempo de ejecución.
Cheers!
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.