2012-05-23 8 views
5

Ich versuche, ein einfaches c# Programm mit zu machen.csc.exe Referenz externe .dll-Datei

Ich habe versucht, mein Programm auf zwei verschiedene Arten zu kompilieren:

1) ich meine .dll-Datei im selben Verzeichnis wie meine .cs Datei gehalten. Als ich lief

csc /r:Growl.Connector.dll,Growl.CoreLibrary.dll /out:test.exe *.cs 

Es zusammengestellt gut und lief auch gut.

2) Jetzt habe ich ein Verzeichnis in meinem aktuellen Arbeitsverzeichnis namens growl erstellt und hielt meine alle .dll es Hinweise.

Jetzt, wenn ich versuche, es zu kompilieren den folgenden Befehl

csc /r:"D:\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.Connector.dll","D: 
\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.CoreLibrary.dll" /out:test.exe *.cs 

Es kompilierte gut, aber wenn ich versuchte es die unten genannte Ausnahme aufgetreten auszuführen.

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Growl.Connector, Version=2.0.0.0, Culture=n 
eutral, PublicKeyToken=980c2339411be384' or one of its dependencies. The system cannot find the file specified. 
at GrowlNotification.Program.Main(String[] args) 

So ist meine Frage, was der richtige Weg ist, .dll Datei in csc zu verweisen, wenn Dateien in einem externen Ordner befinden.

Hier ist die directory structure für 2. Fall.

Antwort

9

Also meine Frage ist, was ist der richtige Weg, um DLL-Datei in CSC verweisen, wenn Dateien in einem externen Ordner sind.

Sie verweisen bereits auf sie unter bauen Zeit. Sie müssen nur, um sie zu bei Ausführung Zeit zur Verfügung zu stellen, sondern sie in das gleiche Verzeichnis wie die ausführbare Datei zu kopieren, wenn Sie es ausführen möchten.

Sie könnten auch mit dem Global Assembly Cache untersuchen, ob dies signierte Assemblys sind, aber persönlich bleibe ich dabei, nur die ausführbare Datei mit den Bibliotheken zu halten, von denen sie abhängt.

+0

Es gibt also keine Möglichkeit, die '.dll' Datei in einem externen Ordner zu behalten und meine' .exe' durch Doppelklick auszuführen. Wie ich aus Ihrer Antwort verstehe, sollte ".dll" -Datei zur Laufzeit im selben Ordner wie .exe vorhanden sein. – RanRag

+0

@Noob: Ich glaube, es könnte in einem * Unterverzeichnis * sein, wenn Sie eine app.config-Datei hinzufügen, um private bin path probing anzugeben, aber das fügt nur noch mehr Komplexität hinzu. Es ist alles viel einfacher, wenn sich alles im selben Verzeichnis befindet. –

+0

Danke für die Info. – RanRag

1

Sie können diese beim Kompilieren mithilfe der Befehlszeilenoptionen/lib und/reference hinzufügen.

http://msdn.microsoft.com/en-us/library/s5bac5fx.aspx

Aber (Zitat aus dem Artikel)

Eine Alternative zur Verwendung/lib in das Arbeitsverzeichnis zu kopieren, ist keine erforderlichen Baugruppen; Dadurch können Sie einfach den Assembly-Namen an/reference übergeben. Sie können die Baugruppen dann aus dem Arbeitsverzeichnis löschen. Da der Pfad zur abhängigen Assembly im Assembly manifest nicht angegeben ist, kann die Anwendung unter auf dem Zielcomputer gestartet werden und die Assembly im globalen Assemblycache finden und verwenden.

Da der Compiler die Assembly referenzieren kann, bedeutet dies nicht, dass die Common Language Runtime in der Lage ist, die Assembly bei Laufzeit zu finden und zu laden. Weitere Informationen dazu, wie die Laufzeitumgebung nach referenzierten Assemblys sucht, finden Sie unter Wie die Laufzeitumgebung nach Assemblys sucht.

so Jon Skeet die Antwort ist besser. (Ich füge das nur hinzu, um mehr Informationen zu liefern als in einem Kommentar, nicht als Antwort. Jon's Antwort ist die beste IMO)

0

Sie können symlinks zu den Assemblys in Ihrem Bibliotheksordner erstellen, so dass Sie nur brauchen würden um sie an einem Ort auf dem neuesten Stand zu halten.