C# Dateien in .exe speichern

Ghost_Rider_R

Lieutenant
Registriert
Nov. 2009
Beiträge
784
Hallo miteinander,

ist es möglich, dass ich diverse dateien mp3, .exe, .jpg was auch immer in eine von mir erstellte EXE hineinpack?
Ich meine mal was von statisch linken gehört zu haben...

Wenn ja wie funktioniert das? ich benutze VS 2013.

Vielen Dank schonmal

Viele Grüße
Ruff :)
 
Du kannst Ressourcen anlegen und diese dann der EXE hinterlegen - so wird das normalerweise geregelt. Ich würde aber mal ein bisschen Google bemühen als für alle Basics einen Thread nach dem anderen rausballern.
 
VS 2013 hat dazu eine Ressourcenverwaltung. Da kannst du dann Bilder, Töne etc. hinterlegen und beim compilieren werden die dann in die .exe gepackt. Google und das MSDN wird da alles sagen was du wissen musst.
 
Es gibt da meistens ein Ressourcentab, da kannst du angeben, dass die Resource in die exe mit hineincompiliert werden soll. Bei einem älteren VS ging es so, weiß nicht mehr welches ich da benutzt habe, ich glaube ich brauchte damals Icons, also .ico-Files.
 
...gibt es eigentlich vom Programm aus die Möglichkeit auf verlinkte Dateien zu verweisen, bzw diese zu starten? (also wenn Sie als Resource hinzugefügt werden), schließlich existiert ja kein wirklicher Pfad dazu...

ich habs zwar mittlerweile schon gelöst, aber wenn es einen besseren Weg als meinen gibt, dann würde ich den auch gerne mal testen.

Scheint ein Problem zu sein, über welches die Leute schon öfters gestolpert sind...
Ergänzung ()

...keine ne Idee? :-)
 
Das stimmt nicht. Zumindest im allgemeinen Fall; keine Ahnung was das .NET-Framework angeht. Ein Beispiel aus meiner eigenen Bastelstube:

https://github.com/SirDzstic/cryptpe

€: Der relevante Teil ist cryptpe/loader.c:
In der Funktion load() wird eine in einer unsigned char*-Konstanten abgelegte Datei geladen und ausgeführt, ohne dass sie vorher auf einen Datenträger geschrieben wird.
 
Zuletzt bearbeitet:
Und wie machst du das mit einem separaten Prozess wegen UIPI oder Multiuser oder wegen Bitness-Problemen (32 vs. 64) und wie gut funktioniert dein Programm mit einer .NET exe oder Shared Memory oder ...

Klar kann man den NT-Loader nachprogrammieren, aber damit bist du auf dem WINE-Trip und kannst gleich eine VM aufsetzen.

BTW: NULL-Check vergessen in Z. 248 ff. (2x)
Memory Leak (1x) Z. 254
Und weitere, weil du nur deutlich weniger aufräumst.
Und Z. 157: IsBadMemoryPtr? sind wir hier in Java?
 
Hancock: Alles Fälle, in denen die Lösung nicht praktikabel ist, oder gar nicht funktionieren wird.
Das ändert aber nichts daran, dass eine Datei um ausgeführt zu werden nicht grundsätzlich auch auf einem Speichermedium liegen muss

Klar kann man den NT-Loader nachprogrammieren, aber damit bist du auf dem WINE-Trip und kannst gleich eine VM aufsetzen.
Das verstehe ich nicht. WINE führt PE-Binaries doch auch nativ aus und nicht in einer VM. Und wieso denn überhaupt eine VM aufsetzen, wenn man nur ein Programm starten will?

BTW: NULL-Check vergessen in Z. 248 ff. (2x)
Memory Leak (1x) Z. 254
Und weitere, weil du nur deutlich weniger aufräumst.
Und Z. 157: IsBadMemoryPtr? sind wir hier in Java?
Der Loader an sich ist tatsächlich der einzige Teil des Programms, der nicht ursprünglich von mir selbst ist. Siehe auch: Kommentar am Anfang der Datei. Ich bedanke mich für die Hinweise und werde die entsprechenden Korrekturen vornehmen.

€: Die von dir genannten Fehler habe ich korrigiert. Ich bezweifle, dass das alle waren, aber der Code ist wie gesagt nicht von mir und ich möchte ihn nicht aufgrund mangelnden Verständnisses kaputt machen, deswegen werde ich keine weiteren Änderungen aus eigenem Antrieb vornehmen.

Ein offensichtliches Problem ist, dass der Code, der am Ende von load() angesprungen wird, nicht die main() des angehängten Programms ist, sondern eine Funktion, die später main() aufruft und danach das Programm beendet. Alles, was in loader.c und main.c nach der Zeile entryretval = (*Entry)(argc, argv); folgt, wird deshalb nicht mehr abgearbeitet und der allokierte Speicher für das decodierte Programm (uchar *data) und dessen Image, in das es geladen wurde (PMEMORYMODULE result), werden nicht mehr freigegeben. Um dieses Problem zu beheben, müsste ich noch deutliche Änderungen vornehmen, die aber über mein eigentliches Ziel hinaus gehen. Und mein Interesse, ein über ein Jahr altes Projekt, das seinen Zweck erfüllt hat, noch einmal halb zum Leben zu erwecken, hält sich in Grenzen. Besonders, wenn der Aufwand in keinem Verhältnis zum Nutzen steht. Die zwei Speicherbereiche werden sowieso mit Beenden des Prozesses automatisch freigegeben und mehr würde ich nach der Rückkehr aus main() eh nicht machen.
 
Zuletzt bearbeitet:
Das Problem, welches kein Windows-Problem ist, ist das, dass wenn man eine Ressource robust über sein eigenes Programm hinaus verwenden will, man zwingend die Ressource als einzelne Datei rausschreiben muss.
Mir ist bewusst, dass man die Ressource nicht zwingend als Datei haben muss, aber im Endeffekt generierst du nur dynamisch Code, was zwar funktioniert, aber nur solange alle Eventualitäten abgedeckt sind.

Für eine Lösung, die funktionieren MUSS, gibt es nun mal keine andere Lösung als eine temporäre Datei zu erzeugen.
 
Zurück
Oben