2010-03-04 9 views
7

Ich weiß, dass seltsame Situation ist, aber ich muss eine EXE-Datei (oder den Assembler-Code) in mein Projekt einbetten, so dass es nur von der Anwendung gestartet werden kann (es kann Das EXE im Dateisystem nicht erstellen und starten! ....NET: Einbetten einer EXE-Datei in mein Projekt

Ist es möglich?

Edit:

Es ist kein .NET EXE. Auf jeden Fall habe ich die Test.exe Datei als Ressource zu meinem Projekt, und ich habe diese

Dim exestr As Stream = Nothing 
    Dim a As Assembly = Assembly.GetExecutingAssembly 
    exestr = a.GetManifestResourceStream("Test.exe") 
+0

Dies ist nicht möglich. Warum versuchst du das zu tun? – SLaks

Antwort

2

Ich denke, erstellen Sie eine RAM disk, schreiben Sie Ihre EXE-Datei/en aus Ihrer .NET-Ressourcendatei, und führen Sie die Datei dort. Nichts berührt physische Festplatte.

Ich habe keinen Link für eine programmierbare RAM-Disk-API, aber Sie können wahrscheinlich etwas finden, um von Ihrem Programm zu manipulieren. Der andere Vorteil ist, dass Virenscanner dies immer noch zur Sicherheit bestätigen können.

Auch ich denke, wenn Ihre App auf der Festplatte läuft, gibt es keinen guten Grund, warum die betreffende ausführbare Datei nicht auf der Festplatte sein kann. Wenn Sie es über das Netzwerk (herunterladen) es oder etwas, dann zuerst auf der Festplatte speichern und löschen Sie es, wenn die Ausführung.

+0

danke, ich werde das versuchen, hofft funktioniert ... Trotzdem möchte ich nicht schreiben und Datei öffnen, weil die Benutzer nicht die zweite kopieren sollten exe und startet es, wenn sie wollen. – Marcx

+0

War es am Ende eine RAM Disk-Lösung? Nur neugierig. Wenn ja, mit welcher Software haben Sie es implementiert? –

+0

Ich denke, das Problem dabei ist, dass RAM-Disketten die Installation von Software von Drittanbietern erfordert. Was, wenn du das kannst, warum kannst du nicht einfach in das Dateisystem schreiben? – jcmcbeth

4

Wenn die EXE eine .NET-Assembly ist, können Sie die kompilierte binäre in Ihrem (äußeren) Programm einbetten, laden Sie es mit Assembly.Load(byte[]). EDIT: Da ist es nicht, können Sie nicht.

Nach dem Laden der Baugruppe können Sie Funktionen von der inneren Baugruppe (wie die Main-Methode) wie jede andere Baugruppe aufrufen, oder Sie können AppDomain.CurrentDomain.ExecuteAssembly(innerAssembly.FullName) schreiben.

+0

den ersten Beitrag aktualisiert ... die exe ist nicht .Net exe .. – Marcx

+0

Ich werde diese Antwort als Referenz behalten. – SLaks

+0

+1 für die nützliche Info. – si618

5

Nicht möglich. Dies war eine zentrale Designentscheidung, die von Dave Cutler und Co. bei der Entwicklung von Windows NT getroffen wurde. Ein Prozess muss durch eine Datei im Dateisystem gesichert werden. Windows verwendet eine Speicherabbilddatei, um den Code des Prozesses dem virtuellen Speicher zuzuordnen. Dies ist für ein .NET-Programm nicht anders, obwohl ein großer Teil seines Codes JIT in den Speicher kompiliert. Die Assembly, die die IL enthält, wird auf die gleiche Weise zugeordnet.

Gut für mehr als nur effizienten Betriebssystembetrieb, Benutzer und Virenscanner wirklich nicht mögen ausführbaren Code aus dem Nichts knallen.