Ich habe eine visuelle Studiolösung. Ich habe viele Projekte in der Lösung. Es gibt ein Hauptprojekt, das als Start fungiert und andere Projekte verwendet. Es gibt ein Projekt namens "ProjectX". Die Referenz wird dem Hauptprojekt hinzugefügt. ProjectX verweist auf eine andere .NET-DLL (z. B. abc.dll), die nicht Teil der Lösung ist.
Jetzt sollte diese abc.dll in den Ordner bin / debug des Hauptprojekts kopiert werden, wird dort aber nicht kopiert. Warum wird es aus bekannten Gründen nicht kopiert?
RestoreProjectStyle
Lösung verfügbar . Die Idee ist,<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
für jedes .NET Framework-Projekt in der Lösung festzulegen.Antworten:
Ich fand heraus, dass abc.dll NICHT in den Hauptausgabeordner kopiert wird, wenn ProjectX auf die abc.dll verweist, aber keinen der in abc.dll DEFINIERTEN Typen direkt verwendet. (Es wird in den ProjectX-Ausgabeordner kopiert, um es besonders verwirrend zu machen.)
Wenn Sie also an keiner Stelle in ProjectX explizit einen der Typen aus abc.dll verwenden, fügen Sie irgendwo in einer der Dateien in ProjectX eine Dummy-Deklaration ein.
Sie müssen dies nicht für jede Klasse tun - nur ein einziges Mal reicht aus, damit die DLL-Kopie erstellt wird und alles wie erwartet funktioniert.
Nachtrag: Beachten Sie, dass dies möglicherweise für den Debug-Modus funktioniert, jedoch NICHT für die Veröffentlichung. Weitere Informationen finden Sie in der Antwort von @ nvirth.
quelle
Nur eine Nebenbemerkung zu Overlord Zurgs Antwort.
Ich habe die Dummy-Referenz auf diese Weise hinzugefügt und sie hat im Debug-Modus funktioniert:
Im Release-Modus wurde die abhängige DLL jedoch immer noch nicht kopiert.
Dies funktionierte jedoch:
Diese Informationen haben mich tatsächlich Stunden gekostet, um herauszufinden, also dachte ich, ich teile sie.
quelle
AbcDll.AnyClass
es als öffentliches Feld oder Eigenschaft in einer öffentlichen Klasse verwendet wird, dann funktioniert es. Wenn Sie es in einem Verfahren Körper wie dies der Compiler verwendet nicht sehen es . Das Laden dieser Assembly wird verzögert, nicht das, was Sie möchten.Ja, Sie setzen müssen ,
Copy Local
umtrue
. Allerdings bin ich ziemlich sicher , dass Sie auch Referenz benötigen , die Baugruppe aus dem Hauptprojekt und SatzCopy Local
auftrue
und - es ist nicht nur aus einer abhängigen Assembly kopiert werden.Sie gelangen zur
Copy Local
Eigenschaft, indem Sie auf die Baugruppe unter klickenReferences
und F4 drücken.quelle
Es sieht gut aus, wenn Sie es zu einem Assembly-Attribut machen
Die Verwendung wird sein:
quelle
Bin auf dasselbe Problem gestoßen. Hintergrundinfo: Vor dem Erstellen hatte ich der Lösung ein neues Projekt X hinzugefügt. Projekt Y hing von Projekt X ab und Projekt A, B, C hingen von Projekt Y ab.
Build-Fehler waren, dass Projekt-A-, B-, C-, Y- und X-DLLs nicht gefunden werden konnten.
Die Hauptursache war, dass das neu erstellte Projekt X auf .NET 4.5 abzielte, während der Rest der Lösungsprojekte auf .NET 4.5.1 abzielte. Projekt X wurde nicht erstellt, sodass auch der Rest der Projekte nicht erstellt wurde.
Stellen Sie sicher, dass alle neu hinzugefügten Projekte auf dieselbe .NET-Version abzielen wie der Rest der Lösung.
quelle
Ich bin mir nicht sicher, ob dies hilft, aber für mich verweise ich oft auf eine DLL (die sie natürlich automatisch zum Ordner bin hinzufügt). Diese DLL benötigt jedoch möglicherweise zusätzliche DLLs (abhängig davon, welche Funktionen ich verwende). Ich möchte NICHT auf diese in meinem Projekt verweisen, da sie nur im selben Ordner wie die DLL landen müssen, die ich tatsächlich verwende.
Ich erreiche dies in Visual Studio durch "Hinzufügen einer vorhandenen Datei". Sie sollten es an einer beliebigen Stelle außer im Ordner Add_data hinzufügen können. persönlich füge ich es einfach der Wurzel hinzu.
Ändern Sie dann die Eigenschaften dieser Datei in ...
Build Action = None (wenn dies auf so etwas wie Content gesetzt ist, wird die "root" -Version in den root kopiert, plus eine Kopie im Bin).
In Ausgabeordner kopieren = Bei Neuem kopieren (Im Grunde genommen wird es nur dann in den BIN-Ordner gelegt, wenn es fehlt, danach aber nicht mehr)
Wenn ich veröffentliche, sind meine hinzugefügten DLLs nur im BIN-Ordner und nirgendwo anders im Veröffentlichungsspeicherort vorhanden (was ich möchte).
quelle
Sie können auch überprüfen, ob die gesuchten DLLs nicht im GAC enthalten sind. Ich glaube, Visual Studio ist schlau, diese Dateien nicht zu kopieren, wenn sie bereits im GAC auf dem Buildcomputer vorhanden sind.
Ich bin kürzlich in dieser Situation gelaufen, in der ich ein SSIS-Paket getestet hatte, für das Assemblys im GAC erforderlich waren. Ich hatte das seitdem vergessen und mich gefragt, warum diese DLLs während eines Builds nicht herauskamen.
So überprüfen Sie, was sich im GAC befindet (über eine Eingabeaufforderung für Visual Studio Developer):
Oder in eine Datei ausgeben, um das Lesen zu erleichtern:
So entfernen Sie eine Baugruppe:
Ich sollte auch beachten, dass die Dateien, nachdem ich sie aus dem GAC entfernt hatte, nach einem Build korrekt im Verzeichnis \ bin ausgegeben wurden (auch für Assemblys, auf die im Root-Projekt nicht direkt verwiesen wurde). Dies war in Visual Studio 2013 Update 5.
quelle
In meinem Fall war es das Dümmste, verursacht durch ein Standardverhalten von TFS / VS, mit dem ich nicht einverstanden bin.
Da das Hinzufügen der DLL als Referenz zum Hauptprojekt nicht funktioniert hat, habe ich beschlossen, sie als "Vorhandenes Element" mit "Lokal kopieren = Immer" hinzuzufügen. Selbst dann war die Datei nicht da.
Es stellt sich heraus, dass VS / TFS die Datei nicht zur Quellcodeverwaltung hinzugefügt hat, obwohl die Datei in der VS-Lösung vorhanden ist und alles lokal und auf dem Server kompiliert wurde. Es war überhaupt nicht in den "Ausstehenden Änderungen" enthalten. Ich musste manuell zum Versionsverwaltungs-Explorer gehen und explizit auf das Symbol "Elemente zum Ordner hinzufügen" klicken.
Dumm, weil ich mich seit 15 Jahren in VS entwickle. Ich bin schon einmal darauf gestoßen, ich habe mich einfach nicht daran erinnert und irgendwie habe ich es verpasst, weil alles noch kompiliert wurde, weil die Datei eine reguläre Referenz ist, aber die Datei, die als vorhandenes Element hinzugefügt wurde, wurde nicht kopiert, weil sie nicht vorhanden war der Quellcodeverwaltungsserver.
Ich hoffe, das spart jemandem etwas Zeit, da ich 2 Tage meines Lebens dadurch verloren habe.
quelle
gitignore
Muster überein. Beim Hinzufügen als Referenz wurde sie dem Projekt nicht hinzugefügt. Sie MÜSSEN die Datei manuell zur Quellcodeverwaltung hinzufügen !!!Dies ist eine kleine Änderung am Beispiel von nvirth
quelle
Ich würde es zu Postbuild-Ereignissen hinzufügen, um die erforderlichen Bibliotheken in die Ausgabeverzeichnisse zu kopieren. So etwas wie das Zielverzeichnis der XCopy-Pathtolibraries
Sie finden sie unter Projekteigenschaften -> Ereignisse erstellen.
quelle
Problem:
Es ist ein ähnliches Problem bei einer NuGet-Paket-DLL (Newtonsoft.json.dll) aufgetreten, bei der die Build-Ausgabe die referenzierte DLL nicht enthält. Aber die Zusammenstellung geht gut durch.
Fix:
Gehen Sie Ihre Projekte in einem Texteditor durch und suchen Sie nach Referenzen mit Tags. Wie wahr oder falsch. "Privat" ist ein Synonym für "Lokal kopieren". Irgendwo in den Aktionen sucht MSBuild nach Abhängigkeiten, findet Ihre Abhängigkeit woanders und beschließt, sie nicht zu kopieren.
Gehen Sie also jede .csproj / .vbproj-Datei durch und entfernen Sie die Tags manuell. Neu erstellen, und alles funktioniert sowohl in Visual Studio als auch in MSBuild. Sobald das funktioniert hat, können Sie zurückgehen und das aktualisieren, wo Sie denken, dass es sein muss.
Referenz:
https://www.paraesthesia.com/archive/2008/02/13/what-to-do-if-copy-local-works-in-vs-but.aspx/
quelle
KEINE NOTWENDIGKEIT FÜR DUMMY IM CODE
Nur:
oder / und stellen Sie sicher, dass die Referenz im ausführbaren Projekt
"Copy Local"
aufTRUE
(was mein " Fehler " war) gesetzt wurde, dass dies die Einstellung im Basis-referenzierten Bibliotheksprojekt "überschrieben" hat ...quelle
Wenn Sie mit der rechten Maustaste auf die Assembly klicken, auf die verwiesen wird, wird eine Eigenschaft mit dem Namen " Lokal kopieren" angezeigt . Wenn Copy Local auf true gesetzt ist, sollte die Assembly in den Bin aufgenommen werden. Es gibt jedoch Probleme mit Visual Studio, dass die referenzierte DLL manchmal nicht im bin-Ordner enthalten ist. Dies ist die Problemumgehung, die für mich funktioniert hat:
quelle
TLDR; Visual Studio 2019 muss möglicherweise einfach neu gestartet werden.
Ich bin auf diese Situation bei Projekten gestoßen, die auf dem Microsoft.NET.Sdk-Projekt basieren.
Speziell:
Project1
: Ziele.netstandard2.1
Microsoft.Extensions.Logging.Console
über NugetProject2
: Ziele.netstandard2.1
Project1
über eine ProjektreferenzProject2Tests
: Ziele.netcoreapp3.1
Project2
über eine ProjektreferenzBei der Testausführung erhielt ich die Fehlermeldung, dass diese
Microsoft.Extensions.Logging.Console
nicht gefunden werden konnte und sich tatsächlich nicht im Ausgabeverzeichnis befand.Ich habe mich entschlossen, das Problem durch Hinzufügen
Microsoft.Extensions.Logging.Console
zuProject2
zu umgehen, nur um festzustellen, dass der Nuget Manager von Visual Studio nichtMicrosoft.Extensions.Logging.Console
als installiert installiert wurdeProject1
trotz seiner Anwesenheit in derProject1.csproj
Datei wurde .Durch einfaches Herunterfahren und Neustarten von Visual Studio wurde das Problem behoben, ohne dass eine zusätzliche Referenz hinzugefügt werden musste. Vielleicht spart dies jemandem 45 Minuten Produktivitätsverlust :-)
quelle
Sie können sowohl das Hauptprojekt als auch den Build-Ausgabepfad von ProjectX auf denselben Ordner festlegen und dann alle benötigten DLLs in diesem Ordner abrufen.
quelle
Stellen Sie sicher, dass für die von Ihnen verwendete abhängige DLL kein höheres .net-Framework als das .net-Zielframework der Anwendung Ihres Projekts vorhanden ist.
Sie können dies überprüfen, indem Sie Ihr Projekt auswählen, dann ALT + EINGABETASTE drücken, dann auf der linken Seite Anwendung auswählen und dann Ziel-Framework Ihres Projekts auswählen.
Angenommen, das abhängige DLL-Zielframework = 4.0 und das Anwendungs-DLL-Zielframework = 3.5 ändern dies in 4.0
Danke dir!
quelle
Abgesehen von den oben genannten hatte ich eine Lösung für mehrere Projekte zu veröffentlichen. Anscheinend zielen einige Dateien auf unterschiedliche Frameworks ab.
Also meine Lösung: Eigenschaften> Spezifische Version (Falsch)
quelle
Fügen Sie die DLL als vorhandenes Element zu einem der Projekte hinzu, und sie sollte sortiert werden
quelle