2009-06-16 5 views
10

Wenn ich eine A.sln erstellen, die 2 Projekte enthält B.csproj und C.csproj, die interne Projektreferenzen hat, wirft Referenzfehler in MSBuild. Aber wenn ich B.csproj und C.csproj separat in MSBuild erstelle, wirft es keine Fehler. Und auch das Erstellen von A.sln in VS IDE wirft keine Fehler. Ich verwende .NET 2.0 Framework. Unten finden Sie die Skripte, die zum Erstellen der SLN und Projs verwendet wurden.MSBuild erstellt Projekte mit Projektreferenzen korrekt, aber nicht aus der Lösung

MSBuild "<path>/A.sln" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\A.sln.log /verbosity:normal 

MSBuild "<path>/B.csproj" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\B.csproj.log /verbosity:normal 

MSBuild "<path>/C.csproj" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\C.csproj.log /verbosity:normal 

Edit:

die geworfen werden alle Fehler von Code für refernces fehlt (alle sind Projektreferenzen). Ich bekomme nur drei Arten von Fehlern, wie unten angegeben.

Fehler CS0012: Der Typ 'X' ist in einer Baugruppe definiert, die nicht referenziert wird. Sie müssen eine Referenz zur Baugruppe 'Y, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = aad4cbe5d7c27078' hinzufügen.

Fehler CS0234: Der Typ oder Namespace Namen 'X' existiert nicht im Namespace 'Y' (Sie eine Montagereferenz fehlen?)

Fehler CS0246: Der Typ oder Namespace Name ' X‘konnte nicht gefunden werden (sind Sie eine using-Direktive oder ein Montage Referenz fehlt?)

ich gelöscht alle zuvor gebaut DLLs von Build-Pfade vor von beiden IDE und MSBuild zu bauen. Aber IDE funktioniert einfach gut und zeigt keinen Verweis fehlt Indikator im "Refrences" Abschnitt für das Projekt.

Keine Referenzpfade manuell in IDE hinzugefügt.

Ein weiteres Update:

ich, dass nur bemerkt, wenn ich beide öffnen die Projekte aus der Lösung, Referenzen korrekt in IDE zeigen. Aber wenn ich die Projekte einzeln in der IDE öffne, schleichen sich die fehlenden Referenzen, die ich in MSBuild erwähnt habe, ein. Sehr seltsam.

So

buiilding zusammenzufassen .proj in MSBuild - Gute

buiilding .proj in IDE - Fehler

buiilding SLN in MSBuild - Fehler

buiilding SLN in IDE - Gut

Sieht aus sehr wierd für mich. Hilfe viel viel geschätzt.

+9

Immer wenn Sie eine Frage stellen und sagen, dass ein Fehler vorliegt, hilft es wirklich, den Fehler auszuschneiden und einzufügen. Dies gilt für Ausnahmen, Compiler Fehler, Build Fehler ... –

+0

BTW, wenn es die beiden Projekte einzeln ohne Probleme erstellt, dann frage ich mich, ob die beiden Projekte die Projektreferenzen benötigten. OTOH, dies könnte aufgrund der jüngsten Funktion funktionieren, die es MSBUILD ermöglicht, bei Projektverweisen "schlau" zu sein. Da ich dieses Feature nie verstanden habe, kann ich das nicht ausschließen; aber ich empfehle Ihnen, zu bestätigen, ob alle Projektreferenzen erforderlich sind, und ob die Neuerstellung von B die Neuerstellung von C verursacht. –

+0

@blntechie: Danke für das Update. Ich schlage vor, dass Sie den Lösungs-Explorer verwenden. Wählen Sie jede Referenz der Reihe nach aus und sehen Sie sich die Details im Eigenschaftenfenster an. Siehst du etwas Seltsames, wie eines in obj und die anderen in der Tonne? Wenn Sie keine Referenzpfade haben, können Sie Ihre .csproj.user-Dateien nicht ansehen, um sicherzugehen, dass es wirklich keine gibt? –

Antwort

8

MSBuild und VS verwenden beide Projektreferenzen und Projektabhängigkeiten, um die Lösungsbaureihenfolge auszuwählen. Darüber hinaus ist es nicht definiert - und typischerweise unterschiedlich zwischen den beiden. Überprüfen Sie, dass beide korrekt sind. Projektabhängigkeiten werden in den Eigenschaften Ihrer Lösung festgelegt. Wenn das nicht funktioniert, überprüfen Sie die GUIDs in den Projektverweisen in Ihren Projekten mit denen in der Projektmappe. Manchmal kann das Wiederherstellen der Lösung sie beheben.

1

Wie Jon Skeet erwähnt, wäre eine Fehlermeldung hilfreich zu wissen, was das Problem ist. Ohne Details, wenn es in der IDE erstellt, aber nicht in MSBuild erstellt, klingt es so, als ob Sie DLLs haben, auf die Sie in Ihren Projekten verweisen, die in dem Pfad nicht verfügbar sind, in dem Sie die Lösung erstellen. Vielleicht haben Sie sie manuell kopiert, wo die IDE sie finden könnte, oder Sie hatten Referenzpfade in Ihrer IDE eingerichtet, um in einem bestimmten Ordner nachzusehen.

Nur etwas zu überprüfen, während Sie diese anderen Details auf die Frage bekommen.

EDIT: Jetzt, da es einige Details gibt, könnte es eine Reihenfolge des Build-Problems sein. Gibt es in Projekt B eine Projektreferenz für Projekt C? Wenn dies der Fall ist, müssen Sie möglicherweise die Reihenfolge ändern, um Projekt C vor Projekt B zu erstellen.

+0

In meinem Fall hat Proj C Bezug auf Proj B. Und Proj B baut vor Proj C. – blntechie

3

Einige Dinge zu beachten: Erstellen einer Lösung in der IDE ist nicht das gleiche wie das Ausführen von MSBUILD für die .sln-Datei. Sie könnten stattdessen versuchen, devenv.exe/rebuild A.sln zu verwenden. Die IDE spielt mehrere Spiele, um eine .sln-Datei zu erstellen, einschließlich der Erstellung eines "äquivalenten" MSBUILD-artigen Projekts.

Auch die IDE spuckt MSBUILD-Befehle nicht direkt aus. Es gibt eine Interaktion zwischen den beiden, um die Leistung zu verbessern. Zum Beispiel werden die CSC-Aufgaben im Projekt wahrscheinlich in der IDE ausgeführt, anstatt als separate Befehlszeilen-Builds, da MSBUILD sie erzeugt hätte.

Sie sollten auch erwägen, Process Monitor von http://technet.microsoft.com/sysinternals/ zu bekommen, um zu sehen, auf welche Dateien zugegriffen wird.

4

Für mich, wenn ich dieses (oder ein ähnliches) Problem hatte, behebt das manuelle Überprüfen (und Reparieren) der Guids Line-Up mein Problem. Es ist ärgerlich, Guids zwischen .sln- und .csproj-Dateien aufzuspüren, aber es funktioniert.

Normalerweise lasse ich den Projektverweis fallen und füge ihn wieder hinzu, und das behebt das Problem (sobald ich die problematischen nicht übereinstimmenden Guids gefunden habe). Vielleicht sollte ich das zuerst probieren. Es ist einfacher.

+1

Das Gleiche funktionierte für mich. Der beste Weg, um herauszufinden, welche GUIDs falsch ausgerichtet waren, bestand darin, Visual Studio aus der Gleichung herauszunehmen und rein mit MSBuild zu arbeiten, wodurch die Fehler an die Oberfläche gelangen. Siehe diesen Artikel, wie man das macht: http://www.codeproject.com/Tips/177770/Creating-MSBuild-projects-from-sln-files.aspx – rohancragg

1

Entfernen Sie die Baugruppe aus GAC (C: \ WINDOWS \ Assembly-Ordner - wählen Sie Ihre Baugruppe und rechts klicken und deinstallieren).

Da die Lösung den Verweis mithilfe von GUID behält und wenn diese GUID in GAC ist, wird weiterhin die GAC-Version für die Kompilierung verwendet.

Verwandte Themen