2008-12-17 11 views
18

Ich habe eine CommonUtils-Lib, die ich in eine DLL eingebaut habe, die ich aus mehreren meiner Projekte referenziere. CommonUtils hängt von log4net.dll ab, das als Dateiverweis festgelegt wurde, und copy-local = true, wenn CommonUtils.dll erstellt wurde. log4net.dll und CommonUtils.dll sind nicht in GAC.Abhängigkeiten von Referenzen, die nicht in das Ausgabeverzeichnis kopiert wurden

Alles funktioniert gut in MyWorkingProject, wo ich nur einen Dateiverweis auf CommonUtils.dll - log4net.dll zeigt im Ausgabeverzeichnis (wie es eine Abhängigkeit von CommonUtils.dll ist aber nicht von MyWorkingProject referenziert). Allerdings, wenn ich ein neues Projekt erstellen, um einige Unittests hinzuzufügen: MyWorkingProjectTest und Projektverweis MyWorkingProject und dann Dateireferenz CommonUtils.dll wieder hier (ich möchte einige der CommonUtils verwenden) dann beim Aufbau log4net.dll, die eine Abhängigkeit in beiden ist Projektreferenz und in der Dateiverweis wird auch nicht in das Ausgabeverzeichnis kopiert.

Kann jemand klären, was hier passiert? Weiß der Compiler nicht, welche der log4net.dll-Dateien er greifen sollte? Gibt es etwas, was ich hier falsch mache? Sollte ich das anders machen, damit die log4net.dll explizit kopiert wird? Macht es Sinn, dass ich log4net explizit referenzieren muss?

Antwort

1

Ich glaube, wenn Sie log4net nicht als Referenz in Ihrem Projekt hinzufügen, wird es nicht kopiert.

+0

Wie würden Sie log4net als Projektverweis hinzufügen, da ich nur die verteilte Binärdll habe. Auch warum sollte ich einen Verweis hinzufügen, da es einfach eine Abhängigkeit von einer meiner Referenzen ist. Jemand hat angegeben, dass Sie nicht auf Bibliotheken verweisen sollten, die Sie nicht explizit in Ihrem Code verwenden. – Fadeproof

+0

Ich habe nicht als "Projektreferenz" sondern als "Referenz" in Ihrem Projekt verstanden. – user7116

0

Wenn ich in der Vergangenheit eine ähnliche Situation hatte, erhielt ich eine Compiler-Warnung in Visual Studio, die mir sagte, dass ich einen Verweis auf die abhängige Bibliothek hinzufügen musste.

Erhalten Sie eine solche Warnung, wenn Sie kompilieren? Wenn dies der Fall ist, folgen Sie den Anweisungen und Log4net sollte in Ihr Ausgabeverzeichnis kopiert werden.

+0

Problem ist, dass ich zwei Referenzen habe, die Abhängigkeiten zu log4net haben und es scheint, dass es etwas eingebautes Studio gibt, um die widersprüchliche Abhängigkeit nicht zu kopieren (obwohl es dieselbe ist). Alles funktioniert wie erwartet, wenn ich nur 1 referenziere, aber es wird nicht kopiert, wenn ich beide referenziere. ? – Fadeproof

+0

Sind beide Referenzen wirklich auf dieselbe Baugruppe? Überprüfen Sie die Eigenschaften der einzelnen Referenzen, um sicherzustellen, dass der Pfad identisch ist. – Bevan

2

Dies ist von Entwurf. Sie müssen über die Implikationen nachdenken, die die automatische Vererbung von Referenzen verursachen würde. Während Sie logisch sehen können, was die Referenzen sein sollten, gibt es keine solche Beschreibung für den Compiler. Sie könnten theoretisch das Framework und einen guten Teil Ihres Betriebssystems reproduzieren, wenn es den gesamten Abhängigkeitsbaum durchläuft.

Es ist definitiv ein Schmerz, und ich stimme zu und verstehe Ihre Frustration, aber ich nehme an, dass Microsoft nicht in der Lage war, einen logischen Weg zu finden, dies anders zu tun.

+0

Kannst du mir raten, wie ich das dann machen soll? Wenn ich LibA und LibB habe, die beide von log4net abhängen und sich in MyProjDir/LibA und MyProjDir/LibB befinden, die beide log4net.dll enthalten. Auf welche log4net.dll sollte ich verweisen? Ist copy-local für log4net.dll nicht der richtige Weg beim Erstellen von libA und libB? – Fadeproof

+0

Ich persönlich gebe alle freigegebenen Referenzen zum Top-Level-Projekt. Wenn beispielsweise beide Bibliotheken von einer Anwendung verwendet werden, würde ich log4net.dll direkt zum Ordner/bin der Anwendung hinzufügen. Es ist nicht die beste Lösung, aber ich finde es einfacher als die Referenz zu jagen. –

+0

"von und Anwendung" = "von einer Anwendung". Auch wenn ich sage, dass ich die Verweise auf die oberste Ebene hinzufüge, täuscht es.Ich füge keine Referenz hinzu - ich füge nur dem Ordner/bin hinzu, da es sich im Suchpfad für die Bibliotheken befindet, die danach suchen. –

Verwandte Themen