Вопрос по .net, 64bit, vb.net, 32-bit – Как заставить MSBuild скомпилировать для 32-битного режима?

30

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

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

/p:Platform=win32 /p:Platform=x86 /p:ProcessorArchitecture=x86

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

Ваш Ответ

8   ответов
2

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

Error: User Rate Limit Exceededstackoverflow.com/a/10511759/6229375
Error: User Rate Limit Exceeded
46

В соответствии сMSDNвы делаете правильные вещи. Похоже/p:Platform=x86но на самом деле, может быть, это/p:PlatformTarget=x86.

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

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

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

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

Затем вы указываете желаемую «платформу» и "аромат" в вашемTeam Build .proj / .targets файлы. Например:

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

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

По поводу вашего комментария:

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

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Eric Nicholson
0

Более практичный способ найти подходящее свойство - открыть один из проектов .csproj.  файл (в случае c #) и увидеть свойство, которое затрагивается при выборе & quot; x64 & quot; / "AnyCPU" / & quot; x86 & quot; из визуальной студии. Какое бы свойство не изменялось, вам нужно установить его из командной строки. В Visual Studio 2015 он выглядит как & lt; Platform & gt ;. Таким образом, вы можете вызвать msbuild с аргументом/p:Platform=x64 и это должно работать.

20

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

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

<PlatformTarget>x86</PlatformTarget>
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Eric Nicholson
13

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

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

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

Error: User Rate Limit Exceeded Eric Nicholson

Похожие вопросы