Frage

Ich stieß auf eine seltsame Situation mit MSBuild gerade jetzt. Es gibt eine Lösung, die drei Projekte hat: LibX, liby und Exe. Exe verweist LibX. LibX seinerseits verweist liby, hat einige Inhaltsdateien, und auch Hinweise auf eine Drittanbieter-Bibliothek (mehrere vorgefertigte Baugruppen sowohl im GAC und lokale Ordner lib installiert ist). Die Drittanbieter-Bibliothek wird als „Copy Local“ ( „private“) markiert und erscheint in der Ausgabe des LibX Projektes, da die liby der Ausgabe und LibX Inhalt Dateien. Nun Ausgang Exe-Projektes hat LibX Projektausgabe, Inhaltsdateien des LibX Projektes liby Projektausgabe (von LibX kommen), aber keine Fremd Bibliothek Baugruppen.

Jetzt habe ich dies um durch die Drittanbieter-Bibliothek direkt in Exe-Projekt verweisen, aber ich fühle mich nicht eine „richtige“ Lösung ist.

Jeder hatte dieses Problem vor?

War es hilfreich?

Lösung

Ja, ich habe dieses Problem hatte, auch. Obwohl ich sonst sagen würde gerne, ich glaube, Sie alle transitiven Abhängigkeiten als Referenzen in Ihrer Build-Datei enthalten muss.

Andere Tipps

Es gibt einen Unterschied im Verhalten, wenn sie mit MSBuild Gebäuden (das heißt Befehlszeile, TFS bauen und andere Werkzeuge) im Vergleich zu mit Visual Studio zu bauen. Die sekundären Referenzen sind in den Referenzen enthalten variable Aufgaben kompilieren in MSBuild gesendet.

Es gibt mehrere Erweiterungspunkte von MSBuild vorgesehen ändern, wie Referenzen aufgelöst werden sollen. ich habe auf meinem Blog weitere Informationen über den Hintergrund geschrieben.

Als Abhilfemaßnahme den folgenden Code hinzuzufügen, in Sie vbproj oder csproj Dateien

  <Target Name="AfterResolveReferences">
    <!-- Redefine referencepath to add dependencyies-->
    <ItemGroup>
     <ReferencePath Include="@(ReferenceDependencyPaths)">
     </ReferencePath>
    </ItemGroup> 
  </Target>

Microsoft hat erklärt, dass dies ein auf Connect beheben nicht ist

Sie können tatsächlich die Microsoft.CSharp.targets oder Microsoft.VisualBasic.targets Datei gehen in (im Rahmen Verzeichnis befinden, in der Regel C: \ Windows \ Microsoft.NET \ Framework \ v3.5) und ändern Sie den csc oder vbc Task-Parameter zusätzliche Referenz Abhängigkeiten enthalten. In der Datei (VB Zielen, Zeile 166; C # Ziele, Zeile 164) Änderung: \

References="@(ReferencePath)"

References="@(ReferencePath);@(ReferenceDependencyPaths)"

Dies könnte andere Probleme verursachen, je nachdem wie kompliziert die Dinge sind, und es kann Tricks mit dem Visual Studio inproc Compiler spielen, aber es ist der einzige Weg, um es in MSBuild zu tun, dass ich gefunden habe.

Josant Antwort für mich fast gearbeitet; Ich hielt einen Fehler in Visual Studio bekommen, als ich versuchte, dass:

Ein Problem trat beim Versuch, die "Referenzen" Parameter für die IDE In-Prozess-Compiler zu setzen. Fehler HRESULT E_FAIL wurde von einem Aufruf an einer COM-Komponente zurückgegeben

Die Lösung für mein Problem war eine Bedingung für die ItemGroup zu setzen, wie folgt aus:

<Target Name="AfterResolveReferences">
  <!-- Redefine referencepath to add dependencies-->
  <ItemGroup Condition=" '$(BuildingInsideVisualStudio)' != 'true' ">
    <ReferencePath Include="@(ReferenceDependencyPaths)"></ReferencePath>
  </ItemGroup>
</Target>

, die Visual Studio verursachte die Referenzänderung vollständig zu ignorieren, und die Build arbeitet lokal und auf dem Build-Server in Ordnung.

Ich habe Alex Yakunin kombiniert Lösung mit einem, auch wird kopieren nativen dLL .

Die AfterResolveReferences Methode schlägt fehl, wenn Sie einen gerichteten Graphen keinen Baum mit einem habe „versucht, verschiedene Kopien der DLL zu implementieren“ Fehler. (Siehe So konfigurieren msbuild / MSVC abhängige Dateien von abhängigen Assemblys bereitstellen )

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top