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?
Hi,
Ich habe da ein C# Programm geschrieben, was aber nur funktioniert, wenn die benötigte .DLL im Ordner mit dem Programm zusammen drin ist. Aber ich würde gerne die .DLL Datei irgendwie in das Programm mit einbinden, damit man später nur die .exe Datei ohne die .DLL hat.
Die .DLL Datei selbst ist aber nicht mit C# geschrieben worden, sondern mit C++.
5 Antworten
Früher hab ich das zu Win32-API-Zeiten auf zwei Arten gelöst:
- 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.
- 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.
Static Linking ist auch in C# möglich, wenn auch nicht so geradlinig wie in C.
Dies an dieser Stelle darzulegen ist zu aufwendig. Bitte lies dazu folgende Artikel:
https://stackoverflow.com/questions/39116/linking-statically-in-c-sharp
https://liiw.blogspot.com/2010/12/c-and-static-linking.html?m=1
https://stackoverflow.com/questions/1868449/static-linking-of-libraries-created-on-c-sharp-net
Dann musst du eine Installer .exe machen, welche beim Ausführen deine Programm.exe und dein . dll in einen definierten Ordner platziert