Определить платформу (x86 или x64) в событии после сборки

Наш проект на С# зависит от некоторых собственных DLL, которые мы копируем в выходной каталог в команде после сборки. Мы нацелены как на x86, так и на x64bit, поэтому нам нужно скопировать 32-разрядную версию собственных dll для нашей сборки x86 и 64-разрядные версии dll для сборки x64. Мы используем Visual Studio 2015 и 2017.

Я помещаю соответствующие версии dll в папки "Native dlls\x86" и "Native dlls\x64". В VS2017 в свойствах проекта на странице сборки проекта я явно указываю «Цель платформы» - либо x86, либо x64, а не любой процессор, и я планирую использовать команду после сборки, как показано ниже.

xcopy /y "$(SolutionDir)\Native dlls\ PLATFORM_x86_or_x64 \*.*" $(ProjectDir)$(OutDir)

где PLATFORM_x86_or_x64 – это строка, указывающая архитектуру процессора, для которой будет создаваться проект. Как я могу определить в событии после сборки, будет ли скомпилированный проект работать как 32-разрядный или 64-разрядный процесс?

В Microsoft Doc я наткнулся на макрос PlatformShortName, но кажется, что он недоступен в VS 2015/2017 - он разрешается в пустую строку

ИЗМЕНИТЬ, чтобы объяснить разницу между этим вопросом и событием до и после сборки параметры:

Ответы на параметры события до и после сборки просто содержат списки до/после -макросы сборки, у которых нет макроса, указывающего выбор «Цель платформы» на странице сборки проекта (для VS 2015/2017)

Я думаю, что есть путаница между двумя терминами, выбранными Microsoft так похожими:

  • "Platform Target", который определяет, для какой архитектуры процессора (x86/x64 и т. д.) будет компилироваться проект. В зависимости от этого скомпилированный код будет работать в Windows как 32-битный или 64-битный процесс, и процесс может загружать только 32-битные или 64-битные dll соответственно. Platform Targets – это список с предопределенными значениями, вы не можете добавить новое значение;
  • «Solution/Project/Build Platform», который просто представляет собой набор параметров сборки, включающих саму «Platform target». Microsoft также называет его целевой/целевой платформой в документе. Вы можете создать собственную платформу решений и дать ей собственное имя. Разработчик выбирает, какая целевая платформа будет выбрана для платформы проекта, например. Целевая платформа x86 может быть выбрана для платформы проекта "Любой процессор" или даже целевая платформа x86 для Платформа с имя "x64". Макрос PlatformName определяет, какая Платформа решения выбрана.

Мой вопрос был о том, как определить в событии после сборки, какая была выбрана целевая платформа, или, точнее, будет ли проект компилироваться как 32-битный или 64-битный процесс. Кажется, это невозможно сделать в VS 2015/2017. Я могу создать условие после сборки, чтобы проверить текущую платформу решения (как предложено Lex Li) и предполагают целевую архитектуру процессора (Целевая платформа), но ее можно изменить независимо (с x64 на x86 или Предпочитать 32-разрядную версию, выбранную для Любой процессор), и тогда в выходной каталог будут скопированы неправильные собственные библиотеки DLL, и приложение не сможет их загрузить во время выполнения.


person Igor B    schedule 02.08.2019    source источник
comment
Используйте два события после сборки (одно для x64 и другое для x86), а затем добавьте к ним условия для проверки целевой платформы ($(Platform) == "x86").   -  person Lex Li    schedule 03.08.2019
comment
См. отмеченный дубликат для списка параметров, доступных в событиях сборки, включая параметр PlatformName.   -  person Peter Duniho    schedule 04.08.2019