DLL Problem

Klobow

Mitglied
Hallo Zusammen,

ich kämpfe jetzt schon länger an einem Problem mit DLLs und hoffe Ihr könnt mir helfen, da meine Such im Internet und auch in diesem Forum bis jetzt erfolglos verlief.

Ich habe ein Projekt erstellt das aus mehreren 'Subprojekten' besteht. Die 'Subprojekte' werden zu jeweils zu DLLs kompiliert. Im Hauptprojekte habe ich diese als Verweise über den Reiter "Projekte" eingebunden.
In den Verweisoptionen ist eingestellt das eine lokale Kopie erstellt werden soll, wenn ich diese nicht einstelle findet er die DLLs nicht.
Nach dem Kompilieren liegen nun (meine) DLLs zusammen mit der exe im Stammverzeichnis, wenn ich die exe jetzt Starte läuft alles einwandfrei. Kopiere ich die DLLs dann aber in ein Unterverzeichnis im Stammverzeichnis startet das Programm nicht mehr. Ich gehe mal davon aus das er die DLLs nicht findet.

Laut MS Homepage (sorry ich weiß nicht mehr auf welcher Seite ich hab soviel gelesen) sucht er DLLs erst im Stammverzeichnis, dann in Unterordnern und dann in der GAC. An dieser Stelle sei angemerkt, das ich das verwenden der GAC wenn möglich vermeiden will.

So, viel geschrieben, jetzt hoffe ich, das mir jemand helfen kann. :)
Noch was, sorry, kann ich beim Programmstart feststellen ob eine DLL fehlt und dann das Programm ordentlich mit einer Meldung: "Die Datei xy.dll wurde nicht gef. das Prog wurde beendet" beenden? Damit mein ich nicht ob ich mir das von Hand in den Startup der MainForm programmieren kann sondern ob das automatisch geht.

Herzlichen Dank schonmal für jede Antwort
Tobias
 

Nico Graichen

Erfahrenes Mitglied
Hi

Die .NET-Runtime hat eine bestimmte Reihenfolge, in der sie nach Referenzen sucht. (da ich jetzt nichts falsches sagen will, schreib ich diese mal nicht auf).
Zu deinem Problem:
Als erstes empfehle ich dir, dass du nicht die Projekte referenzierst sondern die fertigen DLLs. Deine einzelnen Projekte solltest du so einstellen, dass sie alle ins gleiche Verzeichnis kompilieren. Zusätzlich solltest du die Projekte für die DLLs so konfigurieren, dass sie direkt ins Unterverzeichnis bauen.
Die Referenzen zur DLL sollten dann jedoch so sein, dass sie nicht kopiert werden.

Ich kann das hier jetzt leider nicht ausprobieren und meine Projekte sind so, dass Exe und DLL in einem Verzeichnis liegen, aber so in etwa sollte die Angelegenheit funktionieren.
 

Klobow

Mitglied
Hallo Nico,

erstmal danke für deine Antwort, sorry das ich so lange auf eine warten ließ, aber ich war über's Wochenende nicht da.

Zurück zum Problem, die Suchreihenfolge wie du meinst ist wohl das hier.
Dazu noch eine Frage, dieser RegKey "App Path" ist doch der Selbe wie die Umgebungsvariablen die man in den Systemsteuerung eintragen kann oder?
Wenn ja, dann habe ich das schon versucht und das hat nicht geklappt! :(

Zu deinem Anderen Vorschlag die DLLs direkt zu verlinken, kann ich dann trotzdem nocht
komplett übersetzten und Debuggen? D.h. wenn ich Änderungen an einer DLL vornehme wird das dann auch sofort mit übernommen? Und welche Binde ich dann ein, die Debug oder die Release DLL? Theoretisch müsste ich dann bei jeder kompilierung den Link ändern.

ansonsten noch einen schönen Sonntag.
Gruß Tobias
 

Nico Graichen

Erfahrenes Mitglied
Zu deinem Anderen Vorschlag die DLLs direkt zu verlinken, kann ich dann trotzdem nocht
komplett übersetzten und Debuggen? D.h. wenn ich Änderungen an einer DLL vornehme wird das dann auch sofort mit übernommen? Und welche Binde ich dann ein, die Debug oder die Release DLL? Theoretisch müsste ich dann bei jeder kompilierung den Link ändern.
Nein, musst du nicht. Beim Setzen der REferenzen musst du nur darauf achten, dass du beim gleichen Typ bleibst. Also wenn du für deine Exe Debug gewählt hast, solltest du auch die Debug-DLLs referenzieren. Debuggen kannst du weiter wie gewohnt. Der Debugger kennt die Projekte nicht, er kennt nur die DLL, die PDB und die Source-Files.
Ggf. musst du die Build-Reihenfolge der einzelnen Projekte in der Solution anpassen (Rechtklick auf das Solution-File), wenn die DLLs auch untereinander referenziert sind.
 

Klobow

Mitglied
Nein, musst du nicht. Beim Setzen der Referenzen musst du nur darauf achten, dass du beim gleichen Typ bleibst. Also wenn du für deine Exe Debug gewählt hast, solltest du auch die Debug-DLLs referenzieren.

Das meinte ich doch, jedes mal wenn ich zwischen Debug und Release umschalte (und das kommt leider öfter vor) muss ich die Referenzen ändern. Da es sich hierbei um seeehr viel handelt, ist dies leider nicht praktikabel!

gruß
Tobias
 

Klobow

Mitglied
Hallo Nico,

da bin ich wieder, also ich habe deinen Rat befolgt und die Verweise direkt auf
die Kompilierten dlls geändert, leider ist das Ergebnis das selbe, wenn
die dll nicht im selben Ordner wie die exe liegt läuft das Programm nicht!

Schönen Gruß
Tobias
 

Nico Graichen

Erfahrenes Mitglied
Hm, ok, dann tuts mir leid. Das war die einzige Möglichkeit, die mir einfiel.
Die Assemblies in den GAC zu legen finde ich übertrieben, da sie nur von einer Anwendung genutzt werden und du sie auch niemanden zur Verfügung stellen willst (nehm ich mal an).
Aber wieso willst du die DLLs in ein Unterverzeichnis packen? :confused: Der Sinn ist mir nicht ganz klar


//EDIT
Also ich habs jetzt doch mal ausprobiert und es geht so, wie ich es beschrieben hab!
Hast du bei den Referenzen Copy local auf False gesetzt? Wenn nein, mach das mal
 
Zuletzt bearbeitet:

Klobow

Mitglied
Hallo Nico,

ja wie gesagt, die GAC halte ich auch, aus den von dir angeführten Gründen, für keine gute Lösung.

Aber wieso willst du die DLLs in ein Unterverzeichnis packen? Der Sinn ist mir nicht ganz klar

Ja, auf diese Frage habe ich gewartet. :)
Nun das liegt daran weil es eben nicht ein sondern in der Regel zwei manchmal auch drei und zukünftig evtl. sogar vier Programme sind die hier einen gemeinsammen Librarystamm benutzen und es unabdingbar ist das die DLLs in der selben Version vorliegen. Aus diesem Grund würde ich gerne folgende Hierachie aufbauen:

MeinDir\Prog1\ (spezielle DLLs und Files für Prog1, auch XMLs etc. dabei)
MeinDir\Prog2\ (spezielle DLLs und Files für Prog2, auch XMLs etc. dabei)
MeinDir\Library\ (DLLs die von Prog1 und Prog2 gemeinsam benutzt werden)
MeinDir\Prog1.exe
MeinDir\Prog2.exe

Könntest du mir deinen Versuch bitte per Mail zukommen lassen? Wahrscheinlich
bin ich einfach nur zu dämlich oder hab dich falsch verstanden.
Anm.: Lokale Kopie ist true!

//Edit:
Also die Solution nicht das Kompilat.

schönen Gruß
Tobias