2009-02-21 11 views
6

qualcuno sa come posso incorporare un file exe in una DLL?Incorporato a * .exe in una DLL

Ho uno strumento che è un file exe che chiamo dal codice C#.

Il fatto è che voglio avere 1 dll contenente questo strumento (file exe) e la dll che contiene il mio codice C#.

È possibile incorporare questo file exe all'interno delle risorse?

Thx in anticipo

+0

Ho rimosso il tag "incorporato" poiché questa domanda non è realmente correlata ai sistemi incorporati. –

risposta

9

Certo che lo è. È possibile aggiungere qualsiasi file come RC_DATA nell'applicazione come risorsa. Ma credo che dovrai prima estrarlo sul disco prima di chiamarlo!

Quale IDE/lingua si utilizza?

[EDIT]

Siamo spiacenti! hai detto che stai usando C#.

  1. Aggiungere un file di risorse per voi l'applicazione (tasto destro applicazione nella IDE e selezionare "Aggiungi nuovo elemento".
  2. Utilizzare la barra degli strumenti di editor di risorse per aggiungere un file esistente.
  3. Poi estrarre l'exe ogni volta richiesto dal codice chiamante qualcosa come: System.IO.File.WriteAllBytes (@ "C: \ MyEXE \", Resource1.MyEXE);
+1

Le regole vanno, tranne che è possibile caricare un assieme da un byte [], quindi non è necessario creare il file. – leppie

+0

Le stesse regole vanno, .... (oops typo) – leppie

+0

thx per la tua risposta Quindi, per finire, avrei bisogno di scriverlo sul filesystem per eseguirlo comunque? non c'è possibilità di eseguirlo senza farlo? – GillouX

7

vale la pena tenendo in mente che i vostri usi potrebbero non essere troppo felice per te. Incorporando un eseguibile che non hanno alcun controllo su una DLL che estrai ed esegui probabilmente farà preoccupare le persone sull'esecuzione di un Trojan sul loro computer.

È meglio lasciare il file .EXE nel filesystem ed essere trasparenti su ciò che sta facendo l'applicazione.

+5

Questo non è davvero un problema valido. Se un utente sta eseguendo la mia DLL, ovviamente si fida di me. Inoltre hai mai guardato tutti gli eseguibili helper lanciati dalle applicazioni che usi? – tster

2

È possibile caricare un assieme da un byte []. Questo può essere ottenuto tramite ManifestResourceStream di una risorsa incorporata.

1

Un'alternativa può essere quella di non incorporare l'exe stesso, ma piuttosto includere la sua funzionalità nella dll e utilizzare rundll32 [1] per eseguirlo.

+0

Anche questa sarebbe la mia scelta ... fino a quando leggo questo post The Old New Thing: [Qual è la guida su quando usare rundll32? Semplice: non utilizzarlo] (http://blogs.msdn.com/b/oldnewthing/archive/2013/01/04/10382242.aspx) –

+0

@ VáclavSlavík: collegamento interrotto; [ecco il nuovo] (https://blogs.msdn.microsoft.com/oldnewthing/20130104-00/?p=5643). – hydroiodic

-1

Nota: quando si estrae un file dalle risorse su disco e si esegue il codice su di esso, è possibile che venga attivato Windows Data Execution Prevention: in pratica, Windows tenta di rilevare automaticamente se si suppone che qualcosa debba essere codice o dati e se assomiglia ai dati (quale sarebbe una risorsa), allora impedirà che i dati vengano eseguiti come codice.

Questo diventa un problema particolarmente appiccicoso se l'assembly .NET verrà utilizzato su una rete anziché da un'unità locale - ci sono tutti i tipi di configurazioni di sicurezza .NET che potrebbero impedire il corretto funzionamento di questa.

Un'altra opzione, e non conoscendo i dettagli del tuo progetto, prendi questo con un pizzico di sale: aggiungi un file .exe.readme alla tua installazione che descriva a qualsiasi utente curioso o personale IT perché c'è un eseguibile che non sono Mi aspetto nella directory di installazione :)

+0

Questa è una ... descrizione interessante di DEP. No, DEP in realtà non tagga magicamente gli eseguibili su disco come provenienti da un fork di risorse e quindi non eseguibili. E no, DEP non "prova" a "rilevare" nulla. Invece, è un meccanismo per etichettare le pagine di memoria come eseguibili o non eseguibili. –

Problemi correlati