Почему 64-битная MSBuild загружает 32-битную Расширения?

Я пытаюсь построить проект с использованием MSBuild (v4.0) на 64-битной машине. По какой-то причине MSBuild пытается загрузить 32-разрядное расширение, и я не могу понять, почему. Я уменьшил проблему до наименьшего набора, чтобы продемонстрировать проблему.

Используя следующий файл проекта MSBuild:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
    <Target Name="test">
        <Message Text="bin path: $(MSBuildBinPath)" />
        <Message Text="extensions path: $(MSBuildExtensionsPath)" />
        <Message Text="extensions path (x86): $(MSBuildExtensionsPath32)" />
        <Message Text="extensions path (x64): $(MSBuildExtensionsPath64)" />
    </Target>
</Project>

Я получаю этот вывод:

Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation 2007. All rights reserved.

Build started 8/27/2010 9:56:35 AM.
Project "D:\5\test.proj" on node 1 (default targets).
test:
  bin path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319
  extensions path: C:\Program Files (x86)\MSBuild
  extensions path (x86): C:\Program Files (x86)\MSBuild
  extensions path (x64): C:\Program Files\MSBuild
Done Building Project "D:\5\test.proj" (default targets).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.03

MSBuild, очевидно, знает о 32-битном и 64-битном пути расширений, и из двоичного пути кажется ясным, что я запускаю 64-битный MSBuild.exe, но по некоторым причинам он считает, что расширения должны быть загружены из Программные файлы (x86) вместо Программные файлы . Это вызывает у меня проблемы, так как у меня есть нужное расширение, которое ДОЛЖНО быть правильно загружено в 32-битном / 64-битном процессе, и оно не будет загружаться (MSBuild пытается загрузить 32-битную версию в 64-битном процессе).

Почему?

9
задан Mark 27 August 2010 в 16:02
поделиться

1 ответ

Я сообщил об ошибке в Microsoft Connect, и она была закрыта как "By Design" с таким объяснением:

Вы совершенно правы -- это изменилось, и, строго говоря, теперь неправильно. Однако это было осознанное решение. Причина изменения заключалась в том, что очень многие расширения (например, файлы .targets), устанавливаемые другими продуктами, устанавливаются только в папку с 32-разрядными программными файлами. Они не ожидали 64-битных сценариев, но в целом отлично работали в 64-битной MSBuild. Когда пользователь запускает 64-разрядную версию MSBuild, что сейчас довольно распространено, поскольку используется по умолчанию для Team Build 2010, MSBuildExtensionsPath в прошлом разрешался в 64-разрядные файлы программы, как и ожидалось. Однако это означало, что все те .целевые файлы больше не были найдены, и сборка завершилась неудачно. Было непрактично заставлять все эти продукты исправлять авторские установки, тем более что они уже были отправлены клиентам. Поэтому мы внесли изменение, чтобы MSBuildExetnsionsPath всегда указывал на 32-битное местоположение. Кажется, почти никому не нужна 64-битная локация, и эти люди могут перейти на MSBuildExtensionsPath64. Здесь действительно стоял вопрос о наименее плохом варианте.

Я принимаю доказательства, но не согласен с выводом. Я считаю, что авторы неработающих установщиков заслуживают того, чтобы их расширения не работали на 64-битных машинах.

14
ответ дан 4 December 2019 в 14:26
поделиться