128 votes

Conditionnellement utilisation 32/64 bit de référence lors de la construction dans Visual Studio

J'ai un projet qui s'appuie en 32/64-bit et a correspondant 32/64-bit dépendances. Je veux être en mesure de changer de configurations et d'avoir la bonne référence, mais je ne sais pas comment indiquer à Visual Studio pour utiliser l'architecture appropriée à la dépendance.

Je vais peut-être à propos de ce mal, mais je veux être en mesure de basculer entre x86 et x64 dans la configuration du menu déroulant, et ont référencé dans la DLL être à la droite du nombre de bits.

102voto

Hugo Points 1105

Voici ce que j'ai fait dans un précédent projet, qui nécessitera l'édition manuelle de la .csproj fichier(s). Vous avez également besoin des répertoires distincts pour les différents fichiers binaires, idéalement frères et sœurs les uns des autres, et avec le même nom que la plate-forme cible.

Après l'ajout d'une plate-forme unique de références au projet, ouvrez le .csproj dans un éditeur de texte. Avant la première <ItemGroup> élément à l'intérieur de l' <Project> élément, ajoutez le code suivant, qui aidera à déterminer sur quelle plate-forme vous êtes en cours d'exécution (et la construction).

<!-- Properties group for Determining 64bit Architecture -->
<PropertyGroup>
  <CurrentPlatform>x86</CurrentPlatform>
  <CurrentPlatform Condition="'$(PROCESSOR_ARCHITECTURE)'=='AMD64' or '$(PROCESSOR_ARCHITEW6432)'=='AMD64'">AMD64</CurrentPlatform>
</PropertyGroup>

Alors, pour votre plate-forme de références spécifiques, vous apportez des modifications telles que les suivantes:

<ItemGroup>
  <Reference Include="Leadtools, Version=16.5.0.0, Culture=neutral, PublicKeyToken=9cf889f53ea9b907, processorArchitecture=x86">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\..\Lib\Leadtools\$(CurrentPlatform)\Leadtools.dll</HintPath>
  </Reference>
  <Reference Include="Leadtools.Codecs, Version=16.5.0.0, Culture=neutral, PublicKeyToken=9cf889f53ea9b907, processorArchitecture=x86">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\..\Lib\Leadtools\$(CurrentPlatform)\Leadtools.Codecs.dll</HintPath>
  </Reference>
  <Reference Include="Leadtools.ImageProcessing.Core, Version=16.5.0.0, Culture=neutral, PublicKeyToken=9cf889f53ea9b907, processorArchitecture=x86">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\..\Lib\Leadtools\$(CurrentPlatform)\Leadtools.ImageProcessing.Core.dll</HintPath>
  </Reference>
  <Reference Include="System" />
  <Reference Include="System.Core" />
  <Reference Include="System.Data.Entity" />
  <!--  Other project references -->
</ItemGroup>

Notez l'utilisation de l' $(CurrentPlatform) de la propriété, nous l'avons défini ci-dessus. Vous pouvez, au lieu de cela, utiliser des conditions pour lesquelles les assemblages à inclure pour la plate-forme. Vous pourriez aussi vous devez soit:

  • Remplacer l' $(PROCESSOR_ARCHITEW6432) et $(PROCESSOR_ARCHITECTURE) avec $(Platform) à ne considérer que la plate-forme cible des projets
  • Modifier la plate-forme de la détermination de la logique afin d'être adaptée à la machine, de sorte que vous n'êtes pas la construction/le référencement d'un 64 bit binaire à exécuter sur un 32 bits plate-forme.

Je l'avais écrit à l'origine pour un Wiki interne au travail, mais, je l'ai modifié et publié le processus complet de mon blog, si vous êtes intéressé dans le détail, étape par étape les instructions.

61voto

Justin Holzer Points 1121

Autant que je sache, si votre projet nécessite des références qui sont en 32 bits ou 64 bits spécifique (c'est à dire COM interop assemblies), et vous n'avez aucun intérêt à la modification manuelle de l' .fichier csproj, alors vous aurez à créer des 32-bits et 64 bits des projets.

Il est à noter que la solution suivante est non testé, mais devrait fonctionner. Si vous êtes prêt à modifier manuellement .fichier csproj, alors vous devriez être en mesure d'atteindre le résultat souhaité avec un seul projet. L' .csproj fichier est juste un script MSBuild, donc pour une référence complète, regardez ici. Une fois que vous ouvrez le .csproj fichier dans un éditeur de localiser l' <Reference> - éléments. Vous devriez être en mesure de séparer ces éléments en 3 groupes d'article: références qui ne sont pas spécifiques à une plateforme x86 pour des références précises, et x64-des références spécifiques.

Voici un exemple qui suppose que votre projet est configuré avec les plates-formes cibles nommé "x86" et "x64"

<!-- this group contains references that are not platform specific -->
<ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <!-- any other references that aren't platform specific -->
</ItemGroup>

<!-- x86 specific referneces -->
<ItemGroup Condition=" '$(Platform)' == 'x86' ">
    <Reference Include="MyComAssembly.Interop">
        <HintPath>..\..\lib\x86\MyComAssembly.Interop.dll</HintPath>
    </Reference>

    <!-- any additional x86 specific references -->
</ItemGroup>

<!-- x64 specific referneces -->
<ItemGroup Condition=" '$(Platform)' == 'x64' ">
    <Reference Include="MyComAssembly.Interop">
        <HintPath>..\..\lib\x64\MyComAssembly.Interop.dll</HintPath>
    </Reference>

    <!-- any additional x64 specific references -->
</ItemGroup>

Maintenant, lorsque vous définissez votre projet de construction de la configuration de la cible x86 ou x64 plate-forme, il devrait inclure des références appropriées dans chaque cas. Bien sûr, vous aurez besoin de jouer avec l' <Reference> - éléments. Vous pourriez même configuration mannequin projets où vous ajoutez le x86 et le x64 références, et puis il suffit de copier le nécessaire <Reference> éléments de ceux mannequin fichiers de projet à votre "vrai" fichier de projet.


Edit 1
Voici un lien pour la commune de MSBuild éléments de projet, j'ai accidentellement laissé de côté à partir de l'original post: http://msdn.microsoft.com/en-us/library/bb629388.aspx

20voto

Yochai Timmer Points 19802

Vous pouvez utiliser une condition pour une ItemGroup pour la dll références dans le fichier de projet.
Ce sera la cause de visual studio pour revérifier l'état et les références chaque fois que vous modifiez la configuration active.
Il suffit d'ajouter une condition pour chaque configuration.

Exemple:

 <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <Reference Include="DLLName">
      <HintPath>..\DLLName.dll</HintPath>
    </Reference>
    <ProjectReference Include="..\MyOtherProject.vcxproj">
      <Project>{AAAAAA-000000-BBBB-CCCC-TTTTTTTTTT}</Project>
      <Name>MyOtherProject</Name>
    </ProjectReference>
  </ItemGroup>

8voto

Micke Points 772

Je suis le référencement du x86 Dll, située dans, par exemple, \component\v3_NET4, dans mon projet. Dll spécifiques pour les architectures x86/x64 sont situés dans des sous-dossiers nommés "x86" et "x64" resp.

Alors je suis à l'aide d'un pré-script de compilation des copies winrar Dll (x86/x64) dans le dossier référencé, basé sur $(PlatformName).

xcopy /s /e /y "$(SolutionDir)..\component\v3_NET4\$(PlatformName)\*" "$(SolutionDir)..\component\v3_NET4"

Fonctionne pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X