Existem várias maneiras de resolver o problema.
Sistema de compilação
O MSBuild tem muitos recursos que não podem ser controlados a partir da GUI do Visual Studio. Você pode usar variáveis em quase todos os lugares, às vezes também em condições.
Você pode declarar blocos condicionais em seu arquivo .vcxproj
(que é apenas XML), assim :
<Choose>
<When Condition="'$(Platform)' == 'Win32'">
<ItemGroup>
<Reference Include="SomeProject">
<HintPath>..\Libraries\x86\SomeProject.dll</HintPath>
</Reference>
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<Reference Include="SomeProject">
<HintPath>..\Libraries\x64\SomeProject.dll</HintPath>
</Reference>
</ItemGroup>
</Otherwise>
</Choose>
Existem outras soluções, como esta :
<Content Include="..\..\MyContentFiles\**\*.*">
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
Ele não resolve diretamente seu problema, mas fornece informações adicionais sobre os recursos do MSBuild.
Eu já tive uma solução funcional para um problema muito semelhante (referenciando bibliotecas nativas do .NET com compilações de depuração / release), mas permaneceu no meu empregador anterior.
Se achar que o MSBuild é muito restrito, você sempre pode criar tarefas pós-compilação.
Essa solução também pode fazer parte da solução de diretório separado de arquitetura dupla mencionada abaixo, porque ajuda a automatizar melhor o processo de criação.
Preloading de DLL
Chame LoadLibrary
ou LoadLibraryEx
e carregue a DLL correta manualmente. Isso só é possível se você tiver controle antes que a DLL seja carregada automaticamente pelo carregador do SO.
Diretórios separados
Coloque um lançador no diretório de nível superior. Em seguida, coloque as construções x86 e x64 em diretórios separados:
.\Launcher.exe
.\x64\Game.exe
.\x64\glew32.dll
.\x86\Game.exe
.\x86\glew32.dll
Caminho de pesquisa
IMHO isso nunca deve ser necessário em um ambiente completamente controlado.