it-swarm.com.de

Wie funktioniert Copy-local? log4net.dll wird nicht in das Ausgabeverzeichnis von MyProject kopiert

Ich frage mich, was copy-local = true genau für Referenzen ist. Kopiert er die referenzierte Assembly zusammen mit all ihren Abhängigkeiten in das Ausgabeverzeichnis?

Mein Szenario ist das folgende: Ich habe einen benutzerdefinierten Protokoll-Wrapper, der log4net verwendet. Ich baue eine Versionsassembly von MyLogWrapper.dll mit dem Verweis log4net.dll auf copy-local true. Wenn auf MyLogWrapper.dll von MyProject verwiesen wird, wenn local auf true gesetzt ist, sollte log4net.dll ebenfalls kopiert werden, oder? Ich verweise nur auf MyLogWrapper.dll und keine der Abhängigkeiten in MyProject. log4net.dll wird nicht in das Ausgangsverzeichnis von MyProject kopiert, alle anderen Abhängigkeiten von MyLogWrapper sind jedoch vorhanden. Was könnte das Problem sein?

Ich habe einige weitere Experimente durchgeführt und es scheint, dass wenn ich die Assembly (log4net.dll) von GAC entferne, sie lokal kopiert wird. Kann jemand bestätigen, dass dies das Problem ist?

45
Fadeproof

Leider scheint es, dass gemäß der folgenden Anweisung aus der MSDN-Dokumentation die CopyLocal-Funktionalität für bereits im GAC vorhandene Assemblys nicht wie erwartet funktioniert.

Wenn Sie eine Anwendung bereitstellen, die einen Verweis auf eine benutzerdefinierte Komponente enthält, die im GAC registriert ist, wird die Komponente unabhängig von der CopyLocal-Einstellung nicht mit der Anwendung bereitgestellt. In früheren Versionen von Visual Studio konnten Sie die CopyLocal-Eigenschaft für eine Referenz festlegen, um sicherzustellen, dass die Assembly bereitgestellt wurde. Jetzt müssen Sie die Assembly manuell dem Ordner\Bin hinzufügen. Dadurch wird der gesamte benutzerdefinierte Code auf den Prüfstand gestellt, wodurch das Risiko der Veröffentlichung von benutzerdefiniertem Code verringert wird, mit dem Sie nicht vertraut sind.

Weitere Informationen finden Sie auf der folgenden Seite. Hier erfahren Sie, wie Projektreferenzen funktionieren.

MSDN: Projektreferenzen

31
jpierson

Nachdem Sie diese Frage auf MSDN hier gestellt haben, scheint dieses Verhalten beabsichtigt zu sein. "Wenn Sie eine Anwendung bereitstellen/kopieren, die einen Verweis auf eine benutzerdefinierte Komponente enthält, die im GAC registriert ist, wird die Komponente unabhängig von der Einstellung" Copy Local "nicht mit der Anwendung bereitgestellt/kopiert."

10
Fadeproof

Es gibt einen Trick: Setzen Sie die Referenz Copy Local auf false und dann auf true, und Visual Studio fügt die privaten Metadaten automatisch für diese Referenz hinzu. Zumindest tut VS 2010 dies. Ich habe dies kürzlich getan, um ein Problem mit unserem TFS Build-Server zu beheben, bei dem aus irgendeinem Grund viele Enterprise Library-Komponenten im GAC installiert waren. Daher hatten wir bei der Bereitstellung unseres Projekts aus dem TFS-Drop-Ordner große Probleme. Dieser falsche/wahre Trick hat uns gerettet.

7
JustAMartin

Du musst ein wenig vorsichtig sein, wenn es um lokale Kopien geht, da es mich in der Vergangenheit erwischt hat!

Nur gelegentlich wird es für eine bestimmte .dll nicht automatisch in den Erstellungsordner kopiert. Normalerweise wird dies auf einem Entwicklungscomputer nicht angezeigt, da sich die DLLs häufig auch im GAC befinden (wenn Sie ein Entwicklungswerkzeug/eine Bibliothek installiert haben, die Sie für die Entwicklung verwenden), und Sie dies erst bemerken, wenn es verteilt wird in ein Installationsprogramm und die erforderlichen Dateien fehlen auf einem Client-Computer.

Es gibt nicht viele Informationen zu diesem Fehler, aber dieser Thread demonstriert es für eine bestimmte Bibliothek: hier .

Ich bin der Meinung, dass es eine gute Idee ist (in der Regel auf jeden Fall), genau zu wissen, welche Baugruppen für Ihr Projekt erforderlich sind, und ein Skript oder eine ähnliche automatisierte Aktion zu haben, mit der sichergestellt wird, dass alle erforderlichen Komponenten vorhanden sind. oder wahrscheinlicher, wenn Sie ein Installationsprogramm erstellen oder Dateien für die Verteilung sammeln,

5
xan

Wenn local copy auf true gesetzt ist, werden alle Assemmblys, deren Attribut local copy = tue, in das bin-Verzeichnis der Anwendung kopiert.

In Ihrem Fall verwendet die DLL möglicherweise die andere DLL, so dass dies auch erforderlich ist.

4
Raj Kumar

Ich habe festgestellt, dass dies in Visual Studio 2015 mit Projektverweisen nicht mehr beachtet wird, wenn das referenzierte Projekt von einer GAC-Assembly abhängig ist. Die GAC-Assembly wird immer in die Ausgangsprojektausgabe kopiert. Kopieren Sie local = false. Dies gilt nur für die Ausgabe des Projekts, das die Referenz auf die GAC-DLL enthält.

Feedback verbinden

0
vezenkov