300 Stimmen

MSBuild kopiert keine Referenzen (DLL-Dateien), wenn Projektabhängigkeiten in der Lösung verwendet werden

Ich habe vier Projekte in meiner Visual Studio-Lösung (alle auf .NET 3.5 ausgerichtet) - für mein Problem sind nur diese beiden wichtig:

  1. MyBaseProject <- diese Klassenbibliothek verweist auf eine Drittanbieter-DLL-Datei (elmah.dll)
  2. MeinWebProjekt1 <- dieses Webanwendungsprojekt hat einen Verweis auf MyBaseProject

Ich habe den Verweis auf elmah.dll zu MyBaseProject in Visual Studio 2008 durch Klicken auf "Verweis hinzufügen..." Wählen Sie auf der Registerkarte "Durchsuchen" die Datei "elmah.dll" aus.

Die Eigenschaften der Elmah-Referenz sind wie folgt:

  • Aliasnamen - global
  • Lokal kopieren - wahr
  • Kultur -
  • Beschreibung - Fehlerprotokollierungsmodule und -handler (ELMAH) für ASP.NET
  • Dateityp - Baugruppe
  • Pfad - D:\webs\otherfolder\_myPath\__tools\elmah\Elmah.dll
  • Gelöst - Wahr
  • Laufzeitversion - v2.0.50727
  • Angegebene Version - false
  • Starker Name - falsch
  • Version - 1.0.11211.0

MeinWebProjekt1 Ich habe den Verweis auf das Projekt MyBaseProject von hinzugefügt: "Referenz hinzufügen..." Registerkarte "Projekte", Auswahl von "MyBaseProject". Die Eigenschaften dieser Referenz sind die gleichen, mit Ausnahme der folgenden Mitglieder:

  • Beschreibung -
  • Pfad - D:\webs\CMS\MyBaseProject\bin\Debug\MyBaseProject.dll
  • Version - 1.0.0.0

Wenn ich den Build in Visual Studio Die Datei elmah.dll wird in mein MyWebProject1's Mülltonne Verzeichnis, zusammen mit MyBaseProject.dll!

Wenn ich jedoch sauber mache und MSBuild für die Lösung (über D:\webs\CMS > C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /t:ReBuild /p:Configuration=Debug MyProject.sln) die elmah.dll fehlt im bin-Verzeichnis von MyWebProject1 - obwohl der Build selbst keine Warnungen oder Fehler enthält!

Ich habe bereits sichergestellt, dass die .csproj von MyBaseProject die privat Element mit dem Wert "true" (das sollte ein Alias für " lokal kopieren " in Visual Studio):

<Reference Include="Elmah, Version=1.0.11211.0, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\mypath\__tools\elmah\Elmah.dll</HintPath>
    **<Private>true</Private>**
</Reference>

(Das private Tag erschien standardmäßig nicht in der .csproj-xml, obwohl Visual Studio sagte, dass "copy local" true sei. Ich schaltete "copy local" auf false - gespeichert - und setzte es wieder auf true - gespeichert!)

Was ist mit MSBuild los? Wie bekomme ich die (elmah.dll) Referenz in MyWebProject1's bin kopiert?

Ich möchte NICHT zu jedem Postbuild-Befehl eines Projekts eine Kopieraktion hinzufügen! (Stellen Sie sich vor, ich hätte viele Projekte, die von MyBaseProject abhängen!)

2voto

Giles Roberts Punkte 5998

Mit Visual Studio 2015 wird der zusätzliche Parameter

/deployonbuild=false

in der msbuild-Befehlszeile hat das Problem behoben.

1voto

john.kernel Punkte 302

Vergewissern Sie sich, dass beide Projekte in der gleichen .net-Version sind, überprüfen Sie auch die Eigenschaft copy local, aber diese sollte sein true als Standard

0voto

Gary Brunton Punkte 1678

Ich bin gerade auf ein sehr ähnliches Problem gestoßen. Beim Kompilieren mit Visual Studio 2010 wurde die DLL-Datei in der bin Ordner. Bei der Kompilierung mit MSBuild war die DLL-Datei des Drittanbieters jedoch nicht enthalten.

Sehr frustrierend. Ich habe das Problem gelöst, indem ich die NuGet Verweis auf das Paket in meinem Webprojekt, auch wenn ich es dort nicht direkt verwende.

0voto

Gowrav Punkte 259

Ich glaube nicht, dass die Antwort von @deadlydog mit dem aktuellen Nuget-System gültig ist. Ich habe das Szenario mit Y => X => A => B in Visual Studio 2022 nachgestellt und musste nur den folgenden Befehl im Terminal ausführen

msbuild -t:clean,rebuild,pack

-2voto

Hung Nguyen Punkte 479

Es ist nicht immer eine gute Idee, alle referenzierten DLL-Dateien aus den Projektreferenzen in das Website-Projekt einzubinden, insbesondere wenn Sie mit Dependency Injection : Ihr Webprojekt möchte nur einen Verweis auf die Schnittstellen-DLL-Datei/das Projekt hinzufügen, nicht auf eine konkrete Implementierungs-DLL-Datei.

Denn wenn Sie einen Verweis direkt zu einer Implementierungs-DLL-Datei/einem Implementierungsprojekt hinzufügen, können Sie nicht verhindern, dass Ihr Entwickler ein "new" für konkrete Klassen der Implementierungs-DLL-Datei/des Implementierungsprojekts aufruft, anstatt über die Schnittstelle. Außerdem haben Sie auf Ihrer Website einen "Hardcode" für die Verwendung der Implementierung angegeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X