Używać jednego rozwiązania Visual Studio do budowania zarówno x86, jak i x64 w tym samym czasie?

Mam rozwiązanie x86 Visual Studio z wieloma plikami projektu. Niektóre biblioteki DLL są zaprojektowane do pracy jako wtyczki do innych aplikacji w systemie użytkownika. Rozszerzamy niektóre biblioteki dll, aby móc obsługiwać Aplikacje 64-bitowe. To, co chciałbym zrobić, to skonfigurować rozwiązanie / projekty tak, aby samo naciśnięcie "Build" zbudowało zarówno wersje x86, jak i x64 tych bibliotek DLL. Rozwiązanie zawiera zarówno projekty C++, jak i C#. Zdaję sobie sprawę, że "Batch Build" jest w stanie zbudować zarówno, chociaż byłoby wygodniej, gdyby programiści mogli po prostu kliknąć ten sam przycisk, co wcześniej i wygenerować wszystkie wyjściowe biblioteki DLL.

Oto kilka modyfikacji, które próbowałem przetestować projekt, ale nie udało się:

Próbowałem zmodyfikować <Target Name="AfterBuild"> aby spróbować:

<Target Name="AfterBuild" Condition=" '$(Platform)' == 'x86' ">
  <PropertyGroup>
    <Platform>x64</Platform>
    <PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>
  <CallTarget Targets="Build"/>
</Target>

Ale to powoduje następujący błąd:

C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(565,5): error MSB4006: There is a circular dependency in the target dependency graph involving target "Build".

Myślę, że moje warunki zapobiegną nieskończonej rekurencji, ale rozumiem, że MSBuild nie widział tego, że sposób.

Ja też próbowałem:

<Project DefaultTargets="MyBuild86;MyBuild64" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
...
<Target Name="MyBuild86">
  <PropertyGroup>
    <Platform>x86</Platform>
    <PlatformTarget>x86</PlatformTarget>
  </PropertyGroup>
  <CallTarget Targets="Build"/>
</Target>
<Target Name="MyBuild64">
  <PropertyGroup>
    <Platform>x64</Platform>
    <PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>
  <CallTarget Targets="Build"/>
</Target>

Ale moje DefaultTargets wydaje się być ignorowane z poziomu Visual Studio IDE.

Ostatnio próbowałem stworzyć osobny projekt, który importuje pierwszy projekt:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform>x64</Platform>
    <PlatformTarget>x64</PlatformTarget>
    <ProductVersion>9.0.30729</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <OutputPath>..\$(Configuration)\x64\</OutputPath>
    <ProjectGuid>{A885CAC3-2BBE-4808-B470-5B8D482CFF0A}</ProjectGuid>
  </PropertyGroup>
  <Import Project="BuildTest.csproj" />
</Project>

I do tej pory okazało się to najbardziej obiecujące. Jednak Visual Studio wydaje się ignorować Moje Ustawienia OutputPath z tego nowego projektu i zamiast tego wysyła exe / dll do ścieżki określonej w oryginalnym projekcie. Nie widzę bloku PropertyGroup, który jest wykonywany w oryginalny projekt, żeby to obejść, więc nie jestem pewien, co się dzieje.

Author: PeteVasi, 2009-10-15

8 answers

Robimy coś podobnego do budowania core assemblies dla. NET CF. Spróbuj tego:

<Target Name="AfterBuild">
    <MSBuild Condition=" '$(Platform)' == 'x86' " Projects="$(MSBuildProjectFile)" Properties="Platform=x64;PlatFormTarget=x64" RunEachTargetSeparately="true" />
</Target>
 27
Author: Todd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-16 23:02:52

Importowanie projektu działa u mnie w Visual Studio 2010:

TestProject64.vcxproj

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="TestProject.vcxproj" />
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <ProjectGuid>{B7D61F1C-B413-4768-8BDB-31FD464AD053}</ProjectGuid>
  </PropertyGroup>
</Project>

TestProject64.vcxproj.filtry

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="TestProject.vcxproj.filters" />
</Project>

TestProject.vcxproj ma dwie konfiguracje zdefiniowane wewnątrz: Release / x86 i Release / x64. Jak widać TestProject64.vcxproj ma tylko konfigurację Release / x64. Definiowanie co najmniej jednej konfiguracji w TestProject64.vcxproj jest konieczne, w przeciwnym razie Visual Studio nie będzie w stanie dodać TestProject64.vcxproj do a rozwiązanie.

Teraz możliwe jest włączenie obu TestProject.vcxproj i TestProject64.vcxproj do tego samego rozwiązania i zbudować Release / x86 i Release / x64 w tym samym czasie.

 6
Author: bogser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-23 22:51:04

Myślę, że najlepszym sposobem na to jest wywołanie msbuild z linii poleceń. Nie trzeba edytować plików msbuild, wystarczy uruchomić

msbuild myproj.sln /p:Configuration="Debug|Win32"
msbuild myproj.sln /p:Configuration="Debug|x64"

Zakładam, że jeśli programista korzysta z Visual Studio, to będzie generował biblioteki DLL tylko po to, aby mogły się z nimi debugować, i że masz osobny proces budowania, jeśli faktycznie wdrażasz biblioteki DLL?

 4
Author: the_mandrill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 21:02:58

Dla C++, a jeśli jest to projekt,którego pliki / ustawienia nie zmieniają się często, jednym ze sposobów jest utworzenie dwóch projektów w ramach rozwiązania, przy czym oba projekty odnoszą się do tych samych plików źródłowych. Następnie w kompilacjach x64 ustaw jeden projekt na 64-bitowy, a drugi 32-bitowy. (W kompilacjach x86 ustaw jeden jako 32-bitowy i wyłącz drugi.)

Używamy tego od jakiegoś czasu i działa dobrze.

Oczywiście, trzeba uważać, aby wszelkie zmiany, które wprowadzasz do jednego z nich, były również wprowadzane do jego kopii. tzn. jeśli dodajesz/usuwasz plik lub zmieniasz jego ustawienie budowania, musisz to zrobić w dwóch miejscach. Zmiany w kodzie źródłowym muszą być wykonane tylko raz, ponieważ wciąż jest tylko jedna kopia KAŻDEGO pliku źródłowego.

I oczywiście możesz zdecydować, że robienie tego jest bardziej skomplikowane/ryzykowne niż rezygnacja z używania IDE. W naszym przypadku to działa naprawdę dobrze, choć.

 4
Author: Leo Davidson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-27 11:31:36

Nie będziesz w stanie tego zrobić za pomocą interfejsu użytkownika Visual Studio. W tym celu musisz zhakować pliki MSBuild.

Wypróbuj ten link z MSDN dla MSBuild Overview

 0
Author: Pieter Breed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 18:31:41

Być może przeoczyłem sens tej dyskusji. Korzystając z programu Visual Studio, przejdź do Menedżera kompilacji/konfiguracji. Z listy rozwijanej Active Solution Platform wybierz " nowy...", pojawi się okno dialogowe Nowa platforma rozwiązania. Wybierz x64 i zaakceptuj domyślną kopię z. Zamknij okno dialogowe i Menedżer konfiguracji. Teraz otwórz Build / Batch Build. Sprawdź konfiguracje, które chcesz zbudować i je zbuduj. Znajdziesz Pliki Wykonywalne x64 build oddzielnie od plików wykonywalnych Win32. Możesz zweryfikować że są to, co było zamierzone, klikając prawym przyciskiem myszy na execs i wybierając Właściwości, wybierz kartę kompatybilność. W rozwijanym oknie możesz sprawdzić, w jakich systemach operacyjnych można uruchomić exec. Oczywiście, mogą być inne poprawki, które możesz zrobić, aby uzyskać wszystkie pliki wyjściowe w ich odpowiednich miejscach, ale ta metoda wydaje się nieco prostsza niż oszukiwanie z build niż te opisane powyżej.

 0
Author: Mike Pliam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-08 21:01:48

Sugerowałbym stworzenie atrapy projektu C++ Makefile, a następnie wywołanie MSBuild dwa razy z niego:

msbuild myproj.sln /p:Configuration="Debug|Win32" 

msbuild myproj.sln /p:Configuration="Debug|x64"
 0
Author: Paul B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-14 07:51:46

Napotkałem ten problem z projektem działającym w VS2008 XP (32-bit), a także VS2010 7 (64-bit). Rozwiązaniem, którego użyłem było użycie zmiennej $(PROGRAMFILES). Rozwiązał się poprawnie na obu maszynach.

 -2
Author: JayRu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-16 16:13:08