Как мне заставить MSBuild скомпилироваться для 32-разрядного режима?

StackOverflow https://stackoverflow.com/questions/1074654

Вопрос

Я использую MSBuild (через NAnt) скомпилировать кучу VB.NET собрания.Поскольку эти сборки зависят от COM-взаимодействия, мне нужно гарантировать, что они выполняются в 32-разрядном режиме на 64-разрядных ОС.Я могу скомпилировать исполняемые сборки до 32-разрядной версии, изменив проект в Visual Studio, но мне бы очень хотелось иметь возможность принудительно скомпилировать все исполняемые файлы в 32-разрядный режим на сервере сборки.

Я попробовал несколько параметров командной строки для MSBuild, но безуспешно:

  • /p:Платформа=win32
  • /p:Платформа=x86
  • /p: архитектура процессора=x86

Что я делаю не так?Есть ли какая-нибудь ссылка на свойства, которые MSBuild использует при компиляции проектов VB?

Это было полезно?

Решение

Если сами сборки всегда будут 32-разрядными, почему бы не добавить этот параметр в файл .vbproj?Это выведет MSBuild из уравнения.

Просто добавьте следующую строку в начальную группу свойств в файле .vbproj

<PlatformTarget>x86</PlatformTarget>

Другие советы

Согласно MSDN, ты поступаешь правильно.Выглядит как /p:Platform=x86, но на самом деле, может быть, это /p:PlatformTarget=x86.

Попробуйте просто вызвать MSBuild напрямую с этим параметром (убедитесь, что это не проблема с вашим файлом NAnt.Посмотрите на выходные данные сборки, чтобы найти правильную конфигурацию сборки (Отлаживать / Освобождение).

На всякий случай, если это поможет, я использовал эту командную строку для создания моей целевой платформы x86:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe my.sln /t:build /p:Configuration=Release;Platform=x86

В обозревателе решений щелкните правой кнопкой мыши корневой узел -> Менеджер конфигурации.Вам необходимо определить конфигурацию для всего решения, которая предписывает каждому проекту в рамках сборки быть 32-разрядным.(Примечание:у вас, вероятно, уже есть такой, если вы когда-либо настраивали хотя бы один проект для сборки как 32-разрядный.) Пошаговое руководство смотрите в сообщении в блоге MSDN Конфигурации решений.

Затем вы указываете желаемую "платформу" и "вкус" в своем Построение команды .proj / .targets Файлы.Например:

<ConfigurationToBuild Include="Release|x86">
    <FlavorToBuild>Release</FlavorToBuild>
    <PlatformToBuild>x86</PlatformToBuild>
</ConfigurationToBuild>

Вы можете указать более одного из этих разделов свойств, чтобы создать несколько комбинаций.Я бы скопировал / вставил строку "Release |x86" (или как бы она ни выглядела) непосредственно из вашего .sln файл, чтобы убедиться, что он точно соответствует - вы не можете получить его непосредственно из Solution Explorer.

Что касается вашего комментария:

Оценка свойств MSBuild довольно сложна, поскольку в ней сочетаются декларативный и императивный стили.Смотрите запись в блоге Оценка свойств MSBuild для получения подробной информации.Я предпочитаю не полагаться на его тонкости.

Это правда, что свойства, указанные в командной строке, должны переопределять все остальное, но командная сборка имеет другой уровень сложности. Задача ComputeConfigurationList вызывается повторно с помощью рекурсивного вызова MSBuild, а не как обычная задача.Способ, которым это достигается, заключается в том, чтобы использовать обычные свойства, такие как PlatformToBuild и оберните их в набор глобальных свойств, называемых ConfigurationToBuild.PlatformToBuild (и т.д.), Которые генерируются "на лету", один раз для каждой конфигурации.Это делает механизм командной сборки намного более гибким внутренне, но это также усложняет взлом желаемого поведения командной строки.

Вы могли бы попробовать установить ConfigurationToBuild.PlatformToBuild непосредственно в командной строке - это может сработать, я не уверен.Но это определенно помешает вам когда-либо создавать более одной конфигурации в одном определении сборки.По этой причине я придерживаюсь своего совета, приведенного выше.

Столкнувшись с точно такой же проблемой, я переключился с использования версии MSBuild на C:\WINDOWS\Microsoft.NET\Framework64...к версии на C:\WINDOWS\Microsoft.NET\Framework (нет 64) и все скомпилировано просто отлично.

Для MSBuild версии 15 это /p:PlatformTarget=x86

Ответ Nant msbuild-Task на этот вопрос:

<msbuild project="your.sln">
    <property name="PlatformTarget" value="x86" />
</msbuild>

Более практичный способ, который я использую для поиска нужного свойства, - это открыть один из проектов .csproj файл (в случае c #) и посмотрите на свойство, которое изменяется при выборе "x64" / "AnyCPU" / "x86" в Visual stdio.Какое бы свойство ни было изменено, вам нужно установить его из командной строки.С Visual Studio 2015 это, кажется, <Platform>.Таким образом, вы можете вызвать msbuild с аргументом /p:Платформа=x64 и это должно сработать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top