Wie kann ich eine gewisse .DLL Datei, in mein C# Programm einbinden, damit ich später als fertiges Programm nur eine .exe Datei ohne die benötigte .DLL habe?

5 Antworten

Früher hab ich das zu Win32-API-Zeiten auf zwei Arten gelöst:

  1. Auch EXE-Dateien enthalten eine EXPORT-Tabelle und können als DLL fungieren. Mit einigen selbstgebauten Werkzeugen konnte ich DLLs in meine EXE integrieren, und die benötigten Funktionen exportieren, wobei die EXE sie dann von sich selbst aus wieder importiert.
  2. EXE-Dateien störte es früher nicht, wenn Datenmüll am Ende dran hing. So ziemlich alle Installer funktionerten übrigens genau so. Ich habe dann einfach die benötigten DLLs an die EXE rangepappt, zur Laufzeit in den Speicher gemappt, und konnte über einige Umwege auf die exportierten Symbole zugreifen.

Beide Methoden würde ich als höchst unzuverlässig ansehen und da .net-EXE Dateien intern eine völlig andere bzw. stark erweiterte Datenstruktur besitzen, weiß ich ehrlich gesagt nicht, ob das möglich ist.

Allerdings möchte ich wetten, dass man die Exports aus den .net-DLLs rauspopeln und woanders einbauen kann. Das wird dann zwar lustig, dynamische Offsets zu korrigieren, aber früher bei den ollen Win32-DLLs ist mir das auch gelungen ... hab dafür aber wohl gemerkt schon fast einen halben Disassembler schreiben müssen, also einfach wird das ganze sicher nicht, falls du kein fertiges Werkzeug findest. :)

Das geht nicht.

Das Einzige, was Du tun kannst ist, die DLL als Ressource mit in das Programm aufzunehmen. Dann kannst Du beim Programmstart prüfen, ob die DLL im Ordner liegt, und wenn sie das nicht tut, kannst Du sie aus den Ressourcen dahin kopieren.

Eine DLL muss aber immer in Form einer DLL auch auf der Platte liegen.

(Obiger Tipp klappt natürlich nur, wenn das Programm in dem Ordner, in dem es liegt, selbst auch Schreibrechte hat - das ist zum Beispiel bei C:\Program Files (x86) nicht der Fall!)

Schau dir das workaround an um Ressourcen einzubinden, geht übrigends auch für Bilder bzw alle möglichen Dateien.

Dann musst du eine Installer .exe machen, welche beim Ausführen deine Programm.exe und dein . dll in einen definierten Ordner platziert