2009-02-21 22 views
6

¿Alguien sabe cómo puedo incrustar un archivo exe en un dll?Integrado a * .exe en un dll

Tengo una herramienta que es un archivo exe que llamo desde el código C#.

Lo que pasa es que quiero tener 1 dll que contenga esta herramienta (archivo exe) y el dll que contiene mi código C#.

¿Es posible incrustar este archivo exe dentro de los recursos?

Thx advance

+0

Eliminé la etiqueta "incrustada" ya que esta pregunta no está realmente relacionada con los sistemas integrados. –

Respuesta

9

Sure it is. Puede agregar cualquier archivo como RC_DATA en la aplicación como recurso. ¡Pero creo que tendrás que extraerlo primero al disco antes de llamarlo!

¿Qué IDE/Idioma estás utilizando?

[EDIT]

Lo sentimos! Mencionaste que estás usando C#.

  1. Añadir un archivo de recursos para que la aplicación (haga clic derecho en la aplicación en el IDE y seleccione "Agregar nuevo elemento".
  2. Usar la barra de herramientas en el editor de recursos para añadir un archivo existente.
  3. A continuación, extraer el exe siempre requerido por código de llamada algo así como: System.IO.File.WriteAllBytes (@ "C: \ MyEXE \", Resource1.MyEXE);
+1

Las reglas son válidas, excepto que puede cargar un Ensamblaje desde un byte [], por lo que no es necesario crear el archivo. – leppie

+0

Las mismas reglas son, .... (oops typo) – leppie

+0

thx para su respuesta Entonces, finalmente, ¿tendría que escribirlo en el sistema de archivos para ejecutarlo de todos modos? no hay posibilidad de ejecutarlo sin hacer esto? – GillouX

7

vale la pena dejando al descubierto en cuenta que sus usos pueden no ser demasiado feliz por ti haciendo esto. Incrustar un ejecutable que no tienen control sobre una DLL que extraerá y ejecutará probablemente haga que las personas se preocupen por la ejecución de un troyano en su máquina.

Es mejor dejar .EXE en el sistema de archivos y ser transparente sobre lo que está haciendo su aplicación.

+5

Esto no es realmente una preocupación válida. Si un usuario está ejecutando mi DLL, obviamente ellos confían en mí. Además, ¿alguna vez has visto todos los ejecutables de ayuda iniciados por las aplicaciones que usas? – tster

2

Puede cargar un Ensamblaje desde un byte []. Esto se puede obtener a través de ManifestResourceStream de un recurso incrustado.

1

Una alternativa puede ser no incrustar el propio .exe, sino incluir su funcionalidad en el dll y utilizar rundll32 [1] para ejecutarlo.

+0

Esa sería mi elección también ... hasta que leí esta publicación The Old New Thing: [¿Cuál es la guía sobre cuándo usar rundll32? Fácil: No lo use] (http://blogs.msdn.com/b/oldnewthing/archive/2013/01/04/10382242.aspx) –

+0

@ VáclavSlavík: enlace roto; [aquí está el nuevo] (https://blogs.msdn.microsoft.com/oldnewthing/20130104-00/?p=5643). – hydroiodic

-1

En una nota lateral, recuerde que cuando extrae un archivo de sus recursos en el disco y luego ejecuta el código en él, puede activar Windows Data Execution Prevention - básicamente, Windows intenta detectar automáticamente si se supone que algo es código o datos y si se parece a los datos (lo que haría un recurso), impedirá que los datos se ejecuten como código.

Esto se convierte en un problema particularmente pegajoso si su ensamblado .NET se utilizará en una red en lugar de hacerlo desde una unidad local; existen todo tipo de configuraciones de seguridad .NET que pueden evitar que esto funcione correctamente.

Otra opción, y sin conocer los detalles de su proyecto, tome esto con un grano de sal: agregue un archivo .exe.readme a su instalación que describa a los usuarios curiosos o personas de TI por qué hay un ejecutable que no 't expecting en el directorio de instalación :)

+0

Esa es una ... interesante descripción confusa de DEP. No, DEP realmente no etiquetará mágicamente los ejecutables en disco como provenientes de un fork de recursos y por lo tanto no ejecutables. Y no, DEP no "intenta" "detectar" nada. En cambio, es un mecanismo para etiquetar páginas de memoria como ejecutables o no ejecutables. –

Cuestiones relacionadas