Udostępnij za pośrednictwem


Integracja z programem Visual Studio (MSBuild)

Program Visual Studio hostuje program MSBuild w celu załadowania i skompilowania zarządzanych projektów. Ponieważ program MSBuild jest odpowiedzialny za projekt, prawie każdy projekt w formacie MSBuild może być pomyślnie używany w programie Visual Studio, nawet jeśli projekt został utworzony przez inne narzędzie i ma dostosowany proces kompilacji.

W tym artykule opisano konkretne aspekty hostingu MSBuild programu Visual Studio, które należy wziąć pod uwagę podczas dostosowywania projektów i plików docelowych , które chcesz załadować i skompilować w programie Visual Studio. Ułatwi to upewnienie się, że funkcje programu Visual Studio, takie jak IntelliSense i debugowanie, działają dla projektu niestandardowego.

Aby uzyskać informacje o projektach języka C++, zobacz Pliki projektu.

Rozszerzenia nazw plików projektu

MSBuild.exe rozpoznaje rozszerzenie nazwy pliku projektu zgodne ze wzorcem .*proj. Jednak program Visual Studio rozpoznaje tylko podzbiór tych rozszerzeń nazw plików projektu, które określają system projektu specyficzny dla języka, który załaduje projekt. Program Visual Studio nie ma neutralnego dla języka systemu projektu MSBuild.

Na przykład system projektu C# ładuje pliki csproj , ale program Visual Studio nie może załadować pliku .xxproj . Plik projektu dla plików źródłowych w dowolnym języku musi używać tego samego rozszerzenia co pliki projektu Visual Basic lub C#, które mają zostać załadowane w programie Visual Studio.

Dobrze znane nazwy docelowe

Kliknięcie polecenia Build w programie Visual Studio spowoduje wykonanie domyślnego obiektu docelowego w projekcie. Często ten element docelowy nosi również nazwę Build. Wybranie polecenia Skompiluj lub Wyczyść spowoduje próbę wykonania elementu docelowego o tej samej nazwie w projekcie. Kliknięcie pozycji Publikuj spowoduje wykonanie obiektu docelowego o nazwie PublishOnly w projekcie.

Konfiguracje i platformy

Konfiguracje są reprezentowane w projektach MSBuild według właściwości pogrupowanych w elemecie PropertyGroup zawierającym Condition atrybut. Program Visual Studio analizuje te warunki w celu utworzenia listy konfiguracji i platform projektu do wyświetlenia. Aby pomyślnie wyodrębnić tę listę, warunki muszą mieć format podobny do następującego:

Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "
Condition=" '$(Configuration)' == 'Release' " 
Condition=" '$(Something)|$(Configuration)|$(SomethingElse)' == 'xxx|Debug|yyy' "

Program Visual Studio analizuje warunki elementów PropertyGroup, , ItemGroup, Import, i elementów w tym celu.

Dodatkowe akcje kompilacji

Program Visual Studio umożliwia zmianę nazwy typu elementu pliku w projekcie za pomocą właściwości Akcja kompilacji okna Właściwości pliku. Nazwy typów elementów Compile, EmbeddedResource, Content i None są zawsze wyświetlane w tym menu wraz z innymi nazwami typów elementów już w projekcie. Aby upewnić się, że wszystkie niestandardowe nazwy typów elementów są zawsze dostępne w tym menu, możesz dodać nazwy do typu elementu o nazwie AvailableItemName. Na przykład dodanie następującego kodu do pliku projektu spowoduje dodanie niestandardowego typu JScript do tego menu dla wszystkich projektów, które go importują:

<ItemGroup>
    <AvailableItemName Include="JScript"/>
</ItemGroup>

Dodanie nazw typów elementów do AvailableItemName typu elementu spowoduje, że elementy tego typu będą wyświetlane w Eksplorator rozwiązań.

Uwaga

Niektóre nazwy typów elementów są specjalne dla programu Visual Studio, ale nie są wymienione na tej liście rozwijanej.

Kompilatory w procesie

Jeśli to możliwe, program Visual Studio podejmie próbę użycia wersji kompilatora języka Visual Basic w celu zwiększenia wydajności. (Nie dotyczy języka C#). Aby to działało poprawnie, należy spełnić następujące warunki:

  • W obiekcie docelowym projektu musi istnieć zadanie o nazwie Vbc dla projektów Visual Basic.

  • Parametr UseHostCompilerIfAvailable zadania musi być ustawiony na wartość true.

Funkcja IntelliSense w czasie projektowania

Aby uzyskać obsługę funkcji IntelliSense w programie Visual Studio przed wygenerowaniem zestawu wyjściowego kompilacji, należy spełnić następujące warunki:

  • Musi istnieć element docelowy o nazwie Compile.

  • Obiekt docelowy Compile lub jeden z jego zależności musi wywołać zadanie kompilatora dla projektu, takie jak Csc lub Vbc.

  • Obiekt docelowy Compile lub jeden z jego zależności musi spowodować, że kompilator odbiera wszystkie niezbędne parametry funkcji IntelliSense, szczególnie wszystkie odwołania.

  • Warunki wymienione w sekcji Kompilatory procesów muszą być spełnione.

Tworzenie rozwiązań

W programie Visual Studio plik rozwiązania i kolejność kompilacji projektu są kontrolowane przez sam program Visual Studio. Podczas tworzenia rozwiązania przy użyciu msbuild.exe w wierszu polecenia program MSBuild analizuje plik rozwiązania i zamawia kompilacje projektu. W obu przypadkach projekty są kompilowane indywidualnie w kolejności zależności, a odwołania projektu do projektu nie są przechodzenie. W przeciwieństwie do tego, gdy poszczególne projekty są kompilowane przy użyciu msbuild.exe, przechodzenie projektów do odwołań do projektu.

Podczas kompilowania wewnątrz programu Visual Studio właściwość $(BuildingInsideVisualStudio) jest ustawiona na truewartość . Może to być używane w projekcie lub plikach docelowych , aby spowodować, że kompilacja będzie zachowywać się inaczej.

Wyświetlanie właściwości i elementów

Program Visual Studio rozpoznaje niektóre nazwy i wartości właściwości. Na przykład następująca właściwość w projekcie spowoduje , że aplikacja systemu Windows pojawi się w polu Typ aplikacji w projektancie projektów.

<OutputType>WinExe</OutputType>

Wartość właściwości można edytować w projektancie projektów i zapisywać w pliku projektu. Jeśli taka właściwość ma nieprawidłową wartość ręcznie edytując, program Visual Studio wyświetli ostrzeżenie po załadowaniu projektu i zastąpi nieprawidłową wartość wartością domyślną.

Program Visual Studio rozumie wartości domyślne niektórych właściwości. Te właściwości nie zostaną utrwalone w pliku projektu, chyba że mają wartości inne niż domyślne.

Właściwości o dowolnych nazwach nie są wyświetlane w programie Visual Studio. Aby zmodyfikować dowolne właściwości w programie Visual Studio, należy otworzyć plik projektu w edytorze XML i edytować je ręcznie. Aby uzyskać więcej informacji, zobacz sekcję Edytowanie plików projektu w programie Visual Studio w dalszej części tego tematu.

Elementy zdefiniowane w projekcie z dowolną nazwami typów elementów są domyślnie wyświetlane w Eksplorator rozwiązań w węźle projektu. Aby ukryć element przed wyświetleniem, ustaw metadane Visible na falsewartość . Na przykład następujący element będzie uczestniczyć w procesie kompilacji, ale nie będzie wyświetlany w Eksplorator rozwiązań.

<ItemGroup>
    <IntermediateFile Include="cache.temp">
        <Visible>false</Visible>
    </IntermediateFile>
</ItemGroup>

Uwaga

Metadane Visible są ignorowane przez Eksplorator rozwiązań dla projektów C++. Elementy będą zawsze wyświetlane, nawet jeśli Visible ustawiono wartość false.

Elementy zadeklarowane w plikach importowanych do projektu nie są domyślnie wyświetlane. Elementy utworzone podczas procesu kompilacji nigdy nie są wyświetlane w Eksplorator rozwiązań.

Warunki dotyczące elementów i właściwości

Podczas kompilacji wszystkie warunki są w pełni przestrzegane.

Podczas określania wartości właściwości do wyświetlenia właściwości, które program Visual Studio uznaje za zależne od konfiguracji, są oceniane inaczej niż właściwości, które uznaje za niezależne od konfiguracji. W przypadku właściwości, które są zależne od konfiguracji, program Visual Studio odpowiednio ustawia Configuration właściwości i Platform i instruuje program MSBuild, aby ponownie ocenić projekt. W przypadku właściwości, które uznaje za niezależne od konfiguracji, nie jest określana sposób oceniania warunków.

Wyrażenia warunkowe dla elementów są zawsze ignorowane do celów podejmowania decyzji, czy element powinien być wyświetlany w Eksplorator rozwiązań.

Debugowanie

Aby znaleźć i uruchomić zestaw wyjściowy i dołączyć debuger, program Visual Studio potrzebuje właściwości OutputPath, AssemblyNamei OutputType poprawnie zdefiniowanych. Debuger nie może dołączyć, jeśli proces kompilacji nie spowodował wygenerowania pliku .pdb przez kompilator.

Wykonywanie celu w czasie projektowania

Program Visual Studio próbuje wykonać obiekty docelowe z określonymi nazwami podczas ładowania projektu. Te cele obejmują Compile, , ResolveAssemblyReferences, GetFrameworkPathsResolveCOMReferences, i CopyRunEnvironmentFiles. Program Visual Studio uruchamia te obiekty docelowe, aby można było zainicjować kompilator w celu zapewnienia funkcji IntelliSense, można zainicjować debuger, a odwołania wyświetlane w Eksplorator rozwiązań można rozpoznać. Jeśli te obiekty docelowe nie są obecne, projekt zostanie załadowany i skompiluje się poprawnie, ale środowisko projektowania w programie Visual Studio nie będzie w pełni funkcjonalne.

Edytowanie plików projektu w programie Visual Studio

Aby bezpośrednio edytować projekt MSBuild, możesz otworzyć plik projektu w edytorze XML programu Visual Studio.

Aby rozładować i edytować plik projektu w programie Visual Studio

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy węzeł projektu, a następnie wybierz polecenie Zwolnij projekt.

    Projekt jest oznaczony (niedostępny).

  2. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy niedostępny węzeł projektu, a następnie wybierz polecenie Edytuj <plik> projektu.

    Plik projektu zostanie otwarty w edytorze XML programu Visual Studio.

  3. Edytuj, zapisz, a następnie zamknij plik projektu.

  4. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy niedostępny węzeł projektu, a następnie wybierz polecenie Załaduj ponownie projekt.

IntelliSense i walidacja

W przypadku edytowania plików projektu za pomocą edytora XML funkcja IntelliSense i walidacja są sterowane przez pliki schematu MSBuild. Są one instalowane w pamięci podręcznej schematów, które można znaleźć w <katalogu> instalacyjnym programu Visual Studio\Xml\Schemas\1033\MSBuild.

Podstawowe typy MSBuild są definiowane w pliku Microsoft.Build.Core.xsd i typowe typy używane przez program Visual Studio są definiowane w pliku Microsoft.Build.CommonTypes.xsd. Aby dostosować schematy tak, aby funkcja IntelliSense i walidacja niestandardowych nazw typów elementów, właściwości i zadań, można edytować plik Microsoft.Build.xsd lub utworzyć własny schemat zawierający schematy CommonTypes lub Core. Jeśli tworzysz własny schemat, musisz skierować edytor XML, aby znaleźć go przy użyciu okna Właściwości .

Edytowanie załadowanych plików projektu

Program Visual Studio buforuje zawartość plików i plików projektu importowanych przez pliki projektu. Jeśli edytujesz załadowany plik projektu, program Visual Studio automatycznie wyświetli monit o ponowne załadowanie projektu, aby zmiany zaczęły obowiązywać. Jeśli jednak edytujesz plik zaimportowany przez załadowany projekt, nie będzie monitu o ponowne załadowanie i musisz zwolnić i ponownie załadować projekt ręcznie, aby zmiany zaczęły obowiązywać.

Grupy danych wyjściowych

Kilka obiektów docelowych zdefiniowanych w pliku Microsoft.Common.targets ma nazwy kończące się na OutputGroups lub OutputGroupDependencies. Program Visual Studio wywołuje te obiekty docelowe, aby uzyskać określone listy danych wyjściowych projektu. Na przykład obiekt docelowy SatelliteDllsProjectOutputGroup tworzy listę wszystkich zestawów satelickich, które utworzy kompilacja. Te grupy danych wyjściowych są używane przez funkcje, takie jak publikowanie, wdrażanie i projekt w odwołaniach do projektu. Projekty, które nie definiują ich, będą ładować i kompilować w programie Visual Studio, ale niektóre funkcje mogą nie działać poprawnie.

Rozpoznawanie odwołań

Rozwiązanie odwołania to proces używania elementów referencyjnych przechowywanych w pliku projektu w celu zlokalizowania rzeczywistych zestawów. Program Visual Studio musi wyzwolić rozpoznawanie odwołań, aby wyświetlić szczegółowe właściwości dla każdego odwołania w oknie Właściwości . Na poniższej liście opisano trzy typy odwołań i sposób ich rozwiązywania.

  • Odwołania do zestawów:

    System projektu wywołuje element docelowy o dobrze znanej nazwie ResolveAssemblyReferences. Ten element docelowy powinien generować elementy o nazwie ReferencePathtypu elementu . Każdy z tych elementów powinien mieć specyfikację elementu (wartość Include atrybutu elementu) zawierającą pełną ścieżkę do odwołania. Elementy powinny mieć wszystkie metadane z elementów wejściowych przekazywanych oprócz następujących nowych metadanych:

    • CopyLocal, wskazując, czy zestaw powinien zostać skopiowany do folderu wyjściowego, ustawiony na wartość true lub false.

    • OriginalItemSpec, zawierający oryginalną specyfikację elementu odwołania.

    • ResolvedFrom, ustaw wartość "{TargetFrameworkDirectory}", jeśli została rozpoznana z katalogu programu .NET Framework.

  • Odwołania com:

    System projektu wywołuje element docelowy o dobrze znanej nazwie ResolveCOMReferences. Ten element docelowy powinien generować elementy o nazwie ComReferenceWrapperstypu elementu . Każdy z tych elementów powinien mieć specyfikację elementu zawierającą pełną ścieżkę do zestawu międzyoperajowego dla odwołania COM. Elementy powinny zawierać wszystkie metadane z elementów wejściowych przekazywanych, oprócz nowych metadanych o nazwie CopyLocal, wskazujących, czy zestaw powinien zostać skopiowany do folderu wyjściowego, ustawiony na wartość true lub false.

  • Odwołania natywne

    System projektu wywołuje element docelowy o dobrze znanej nazwie ResolveNativeReferences. Ten element docelowy powinien generować elementy o nazwie NativeReferenceFiletypu elementu . Elementy powinny zawierać wszystkie metadane z elementów wejściowych przekazywanych, oprócz nowego elementu metadanych o nazwie OriginalItemSpec, zawierającego oryginalną specyfikację elementu odwołania.

Skróty wydajności

Jeśli używasz środowiska IDE programu Visual Studio do rozpoczęcia debugowania (wybierając F5 lub wybierając pozycję Debuguj>rozpocznij debugowanie na pasku menu) lub tworząc projekt (na przykład Kompiluj>rozwiązanie kompilacji), proces kompilacji używa szybkiego sprawdzania aktualizacji w celu zwiększenia wydajności. W niektórych przypadkach, w których dostosowane kompilacje tworzą pliki, które są tworzone z kolei, szybkie sprawdzanie aktualizacji nie identyfikuje poprawnie zmienionych plików. Projekty, które wymagają bardziej szczegółowych testów aktualizacji, mogą wyłączyć szybkie sprawdzanie, ustawiając zmienną środowiskową DISABLEFASTUPTODATECHECK=1. Alternatywnie projekty mogą ustawić tę właściwość jako właściwość MSBuild w projekcie lub w pliku importowanych projektów.