Integration von Visual Studio (MSBuild)
Aktualisiert: November 2007
Visual Studio 2005 enthält MSBuild, um verwaltete Projekte zu laden und zu erstellen. Da das Projekt über MSBuild ausgeführt wird, können nahezu alle Projekte im Format von MSBuild in Visual Studio erfolgreich verwendet werden, selbst wenn das Projekt über ein anderes Tool erstellt wurde und über einen angepassten Buildprozess verfügt.
In diesem Thema werden bestimmte Aspekte von MSBuild in Visual Studio erläutert, die beim Anpassen von Projekten und TARGETS-Dateien berücksichtigt werden sollten, die Sie in Visual Studio laden und erstellen möchten. Dadurch können Sie Visual Studio-Features wie IntelliSense sowie Debugging in Ihrem benutzerdefinierten Projekt einsetzen.
Projektdateierweiterungen
MSBuild.exe erkennt jede Projektdateierweiterung, die dem Muster .*proj entspricht. Visual Studio erkennt jedoch nur eine Untergruppe dieser Projektdateierweiterungen, über die das zum Laden des Projekts verwendete sprachspezifische Projektsystem festgelegt wird. Visual Studio verfügt über kein sprachneutrales MSBuild-basiertes Projektsystem.
Über das Visual C#-Projektsystem können z. B. CSPROJ-Dateien geladen werden, in Visual Studio können hingegen keine XXPROJ-Dateien geladen werden. Bei einer Projektdatei für Quelldateien in einer beliebigen Sprache muss die gleiche Erweiterung verwendet werden wie bei den Projektdateien von Visual Basic, Visual C# oder Visual J#, die in Visual Studio geladen werden sollen.
Bekannte Zielnamen
Durch Klicken auf den Befehl Erstellen in Visual Studio wird das Standardziel im Projekt ausgeführt. Häufig wird dieses Ziel auch als Build bezeichnet. Durch Auswählen des Befehls Neu erstellen oder Bereinigen wird versucht, im Projekt ein Ziel mit dem gleichen Namen auszuführen. Durch Klicken auf Veröffentlichen wird das Ziel mit dem Namen PublishOnly ausgeführt.
Konfigurationen und Plattformen
Konfigurationen werden in MSBuild-Projekten durch Eigenschaften dargestellt, die in einem PropertyGroup-Element mit einem Condition-Attribut gruppiert sind. In Visual Studio wird anhand dieser Bedingungen eine Liste der anzuzeigenden Konfigurationen und Plattformen des Projekts erstellt. Damit diese Liste erfolgreich extrahiert werden kann, müssen die Bedingungen in einem Format vorliegen, das dem folgenden Format ähnelt:
Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "
Condition=" '$(Configuration)' == 'Release' "
Condition=" '$(Something)|$(Configuration)|$(SomethingElse)' == 'xxx|Debug|yyy' "
In Visual Studio werden zu diesem Zweck die Bedingungen für PropertyGroup, ItemGroup und Import sowie für die Eigenschaft und die Elemente überprüft.
Zusätzliche Buildvorgänge
In Visual Studio können Sie den Elementauflistungsnamen einer Datei in einem Projekt über die Eigenschaft Buildvorgang im Fenster Dateieigenschaften ändern. In diesem Menü werden Compile, EmbeddedResource, Content und None sowie alle anderen bereits im Projekt vorhandenen Elementauflistungsnamen aufgeführt. Um sicherzustellen, dass alle benutzerdefinierten Elementauflistungsnamen in diesem Menü immer verfügbar sind, können Sie der Elementauflistung mit dem Namen AvailableItemName die entsprechenden Namen hinzufügen. Durch Hinzufügen des folgenden Elements zur Projektdatei wird beispielsweise in diesem Menü der benutzerdefinierte Typ JScript für alle Projekte eingefügt, die diesen Typ importieren:
<ItemGroup>
<AvailableItemName Include="JScript"/>
</ItemGroup>
Hinweis: |
---|
Einige Elementauflistungsnamen sind für Visual Studio spezifisch, werden jedoch in diesem Dropdownmenü nicht aufgeführt. |
Prozessinterne Compiler
Aus Gründen der Leistungssteigerung werden in Visual Studio nach Möglichkeit die prozessinternen Versionen der Visual Basic- oder Visual C#-Compiler verwendet. Dazu müssen die folgenden Bedingungen erfüllt sein:
Ein Ziel des Projekts muss die Aufgabe mit dem Namen Csc (bei Visual C#-Projekten) oder Vbc (bei Visual Basic-Projekten) enthalten.
Der UseHostCompilerIfAvailable-Parameter der Aufgabe muss auf true festgelegt sein.
Es dürfen nur unterstützte Parameterwerte angegeben werden. Mit dem prozessinternen Compiler werden alle in der Aufgabe angegebenen Parameter unterstützt, einige Parameterwerte werden jedoch nicht unterstützt. Die folgenden Parameterwerte der Csc-Aufgabe werden von dem prozessinternen Compiler in Visual C# nicht unterstützt:
NoConfig: false und leere Werte werden nicht unterstützt.
ResponseFiles: Nicht leere Werte werden nicht unterstützt.
AdditionalLibPaths: Nicht leere Werte werden nicht unterstützt.
AddModules: Nicht leere Werte werden nicht unterstützt.
CodePage: Werte ungleich 0 (null) werden nicht unterstützt.
GenerateFullPaths: true wird nicht unterstützt.
LinkResources: Nicht leere Werte werden nicht unterstützt.
Wenn diese Bedingungen nicht erfüllt sind, wird das Projekt über den Befehlszeilencompiler und nicht über den prozessinternen Compiler kompiliert.
IntelliSense zur Entwurfszeit
Zum Aufrufen der IntelliSense-Unterstützung in Visual Studio vor dem Generieren einer Ausgabeassembly in einem Build müssen die folgenden Bedingungen erfüllt sein:
Ein Ziel mit dem Namen Compile muss vorliegen.
Über das Compile-Ziel oder eine der zugehörigen Abhängigkeiten muss die Kompilieraufgabe für das Projekt aufgerufen werden, z. B. Csc oder Vbc.
Über das Compile-Ziel oder eine der zugehörigen Abhängigkeiten muss der Compiler so eingerichtet werden, dass alle erforderlichen Parameter für IntelliSense, vor allem alle Verweise, empfangen werden.
Die im Abschnitt "Prozessinterne Compiler" aufgeführten Bedingungen müssen erfüllt sein.
Erstellen von Projektmappen
In Visual Studio wird die Anordnung der Projektmappendateien und Projektbuilds über Visual Studio gesteuert. Beim Erstellen einer Projektmappe an der Befehlszeile mit msbuild.exe analysiert MSBuild die Projektmappendatei und ordnet die Projektbuilds an. In beiden Fällen werden die Projekte einzeln in der Reihenfolge der Abhängigkeiten erstellt. Gleichzeitig werden Verweise zwischen Projekten nicht durchlaufen. Wenn hingegen einzelne Projekte mit msbuild.exe erstellt werden, werden Verweise zwischen Projekten durchlaufen.
Beim Erstellen in Visual Studio wird die $(BuildingInsideVisualStudio)-Eigenschaft auf true festgelegt. Damit kann im Projekt oder in den TARGETS-Dateien festgelegt werden, dass der Build ein anderes Verhalten aufweist.
Anzeigen von Eigenschaften und Elementen
Visual Studio erkennt bestimmte Eigenschaftennamen und -werte. Über die folgende Eigenschaft in einem Projekt wird beispielsweise im Projekt-Designer im Feld Anwendungstyp die Option Windows-Anwendung angezeigt.
<OutputType>WinExe</OutputType>
Der Eigenschaftenwert kann im Projekt-Designer bearbeitet und in der Projektdatei gespeichert werden. Wenn für diese Eigenschaft beim Bearbeiten ein ungültiger Wert angegeben wird, wird in Visual Studio beim Laden des Projekts eine Warnmeldung angezeigt, und der ungültige Wert wird durch einen Standardwert ersetzt.
Visual Studio erkennt Standardwerte für einige Eigenschaften. Diese Eigenschaften werden in der Projektdatei nur beibehalten, wenn die Werte vom Standardwert abweichen.
Eigenschaften mit beliebigen Namen werden in Visual Studio nicht angezeigt. Wenn Sie beliebige Eigenschaften in Visual Studio ändern möchten, müssen Sie die Projektdatei im XML-Editor öffnen und die Eigenschaften manuell bearbeiten. Weitere Informationen hierzu finden Sie unter Gewusst wie: Bearbeiten von Projektdateien.
Die im Projekt mit beliebigen Elementauflistungsnamen definierten Elemente werden standardmäßig im Projektmappen-Explorer unter dem entsprechenden Projektknoten angezeigt. Um ein Element in der Anzeige auszublenden, legen Sie die Visible-Metadaten auf false fest. Das folgende Element wird beispielsweise im Buildprozess verwendet, im Projektmappen-Explorer jedoch nicht angezeigt.
<ItemGroup>
<IntermediateFile Include="cache.temp">
<Visible>false</Visible>
</IntermediateFile>
</ItemGroup>
Die Elemente, die in den in das Projekt importierten Dateien deklariert sind, werden standardmäßig nicht angezeigt. Die während des Buildprozesses erstellten Elemente werden im Projektmappen-Explorer nie angezeigt.
Bedingungen für Elemente und Eigenschaften
Während eines Builds werden alle Bedingungen vollständig eingehalten.
Beim Festlegen der anzuzeigenden Eigenschaftenwerte werden Eigenschaften, die in Visual Studio als konfigurationsabhängig eingestuft werden, anders ausgewertet als konfigurationsunabhängige Eigenschaften. Bei konfigurationsabhängigen Eigenschaften werden die Configuration-Eigenschaft und die Platform-Eigenschaft in Visual Studio entsprechend festgelegt. Außerdem wird MSBuild angewiesen, das Projekt erneut auszuwerten. Bei konfigurationsunabhängigen Eigenschaften wird nicht festgelegt, auf welche Weise Bedingungen ausgewertet werden.
Bedingte Ausdrücke für Elemente werden beim Festlegen der Elemente, die im Projektmappen-Explorer angezeigt werden sollen, immer ignoriert.
Debuggen
Zum Suchen und Starten der Ausgabeassembly sowie zum Anhängen des Debuggers müssen die Eigenschaften OutputPath, AssemblyName und OutputType in Visual Studio ordnungsgemäß definiert sein. Wenn über den Compiler im Buildprozess keine PDB-Datei generiert wurde, kann der Debugger nicht angehängt werden.
Zielausführung zur Entwurfszeit
In Visual Studio wird beim Laden eines Projekts versucht, Ziele mit bestimmten Namen auszuführen. Zu diesen Zielen zählen Compile, ResolveAssemblyReferences, ResolveCOMReferences, GetFrameworkPaths und CopyRunEnvironmentFiles. Visual Studio führt diese Ziele aus, sodass der Compiler zum Bereitstellen von IntelliSense initialisiert, der Debugger initialisiert und die im Projektmappen-Explorer angezeigten Verweise aufgelöst werden können. Wenn die Ziele nicht vorhanden sind, wird das Projekt ordnungsgemäß geladen und erstellt, bei Vorgängen zur Entwurfszeit in Visual Studio können jedoch nicht alle Funktionen ausgeführt werden.
Bearbeiten von Projektdateien in Visual Studio
Wenn Sie ein MSBuild-Projekt direkt bearbeiten müssen, können Sie die Projektdatei im XML-Editor von Visual Studio öffnen. Weitere Informationen hierzu finden Sie unter Gewusst wie: Bearbeiten von Projektdateien.
IntelliSense und Validierung
Bei Verwendung des XML-Editors zum Bearbeiten von Projektdateien werden IntelliSense und die Validierung über MSBuild-Schemadateien gesteuert. Diese werden in Visual Studio im Schemacache im Ordner [Visual Studio-Installationsverzeichnis]\Xml\Schemas gespeichert.
Die zentralen Typen von MSBuild sind in Microsoft.Build.Core.xsd definiert und die in Visual Studio häufig verwendeten Typen in Microsoft.Build.CommonTypes.xsd. Zum Anpassen der Schemas für die Bereitstellung von IntelliSense und der Validierung benutzerdefinierter Elementauflistungsnamen, Eigenschaften und Aufgaben können Sie entweder Microsoft.Build.xsd bearbeiten oder ein benutzerdefiniertes Schema erstellen, das das CommonTypes-Schema oder das Core-Schema enthält. Beim Erstellen eines benutzerdefinierten Schemas müssen Sie den XML-Editor so einrichten, dass das Eigenschaftenfenster verwendet wird.
Bearbeiten von geladenen Projektdateien
In Visual Studio wird der Inhalt von Projektdateien und der über Projektdateien importierten Dateien zwischengespeichert. Beim Bearbeiten einer geladenen Projektdatei werden Sie in Visual Studio automatisch aufgefordert, das Projekt erneut zu laden, sodass Änderungen wirksam werden. Wenn Sie jedoch eine Datei bearbeiten, die über ein geladenes Projekt importiert wurde, wird keine Meldung zum Neuladen angezeigt. Sie müssen das Projekt dann manuell entladen und anschließend neu laden, damit Änderungen wirksam werden.
Ausgabegruppen
Mehrere in Microsoft.Common.targets definierte Ziele tragen Namen, die mit OutputGroups oder OutputGroupDependencies enden. Visual Studio ruft diese Ziele auf, um spezifische Listen der Projektausgaben abzurufen. Das SatelliteDllsProjectOutputGroup-Ziel erstellt beispielsweise eine Liste aller in einem Build erstellten Satellitenassemblys. Diese Ausgabegruppen werden bei Features wie Veröffentlichung, Bereitstellung und Verweisen zwischen Projekten verwendet. Projekte, in denen diese Features nicht definiert sind, werden in Visual Studio geladen und erstellt, einige Features werden jedoch möglicherweise nicht ordnungsgemäß ausgeführt.
Auflösen von Verweisen
Beim Auflösen von Verweisen werden anhand der in einer Projektdatei gespeicherten Verweiselemente die eigentlichen Assemblys gesucht. Die Auflösung von Verweisen muss in Visual Studio ausgelöst werden, damit im Eigenschaftenfenster ausführliche Angaben zu den Eigenschaften der einzelnen Verweise angezeigt werden. In der folgenden Liste werden die drei Verweistypen sowie deren Auflösung beschrieben.
Assemblyverweise:
Das Projektsystem ruft ein Ziel mit dem bekannten Namen ResolveAssemblyReferences auf. Über dieses Ziel müssen Elemente mit dem Elementauflistungsnamen ReferencePath erstellt werden. Alle Elemente müssen jeweils über eine Elementspezifikation (Wert des Include-Attributs eines Elements) mit dem vollständigen Pfad zum entsprechenden Verweis verfügen. Die Elemente sollten über alle Metadaten der übergebenen Eingabeelemente sowie über die folgenden neuen Metadaten verfügen:
CopyLocal: Gibt an, ob die Assembly in den Ausgabeordner kopiert werden soll. Ist auf true oder false festgelegt.
OriginalItemSpec: Enthält die ursprüngliche Elementspezifikation des Verweises.
ResolvedFrom: Ist auf "{TargetFrameworkDirectory}" festgelegt, wenn es über das Verzeichnis .NET Framework aufgelöst wurde.
COM-Verweise:
Das Projektsystem ruft ein Ziel mit dem bekannten Namen ResolveCOMReferences auf. Über dieses Ziel müssen Elemente mit dem Elementauflistungsnamen ComReferenceWrappers erstellt werden. Alle Elemente müssen jeweils über eine Elementspezifikation mit dem vollständigen Pfad zur Interop-Assembly für den entsprechenden Verweis verfügen. Die Elemente müssen über alle Metadaten der übergebenen Eingabeelemente sowie über neue Metadaten mit dem Namen CopyLocal verfügen, mit denen über die Festlegung auf true oder false angegeben wird, ob die Assembly in den Ausgabeordner kopiert werden soll.
Systemeigene Verweise
Das Projektsystem ruft ein Ziel mit dem bekannten Namen ResolveNativeReferences auf. Über dieses Ziel müssen Elemente mit dem Elementauflistungsnamen NativeReferenceFile erstellt werden. Die Elemente müssen über alle Metadaten der übergebenen Eingabeelemente sowie über neue Metadaten mit dem Namen OriginalItemSpec mit der ursprünglichen Elementspezifikation des entsprechenden Verweises verfügen.