должен был иметь их, но он привязан к конкретной версии MSBuild. И, конечно же, вы должны изменить конфиг. Что на самом деле не подходит для PS, поэтому я сомневаюсь, что вы могли бы получить действительно стабильное решение.

сматриваю возможность запуска MSBuild из сценария Powershell путем прямого подключения к сборкам MSBuild (в отличие от поиска пути установки MSBuild и запуска msbuild.exe как дочернего процесса).

Кто-нибудь делал это? Какой самый простой и простой способ запустить сборку? Есть ли плюсы / минусы в любой технике, на которые вы хотели бы указать? (Меня особенно интересуют любые проблемы, которые могут возникнуть при запуске msbuild в том же процессе / домене приложения, что и остальная часть сценария).

В настоящее время мое мышление выглядит примерно так:

[void][System.Reflection.Assembly]::Load('Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
[void][Microsoft.Build.BuildEngine.Engine]::GlobalEngine.BuildProjectFile("path/main.proj")

Ответы на вопрос(2)

PSake.

Позвольте мне процитировать часть этой страницы:

Помните, что psake - это синтаксический сахар в PowerShell. Так что все, что вы можете сделать в PowerShell, вы можете сделать в psake. Это означает, что вы можете запускать MSBuild, NAnt или другие сценарии. Нет необходимости полностью заменять вашу текущую систему сборки. Вы можете использовать psake для автоматизации и расширения!

psake автоматически добавляет соответствующую версию .NET Framework к своему пути. Таким образом, вы можете получить доступ к MSBuild, csc.exe, vbc.exe или любым другим инструментам, установленным в $ env: windir \ Microsoft.NET \ Framework \ $ version \ без полного пути.

 Milan Gardian23 янв. 2009 г., 15:54
Пожалуйста, давайте не будем вдаваться в философские дебаты на тему «msbuild sucks, вместо этого используйте сборку на основе powershell», поскольку это был не мой вопрос, на самом деле.
 EBGreen23 янв. 2009 г., 16:01
О каких философских дебатах вы говорите? Вы читали страницу? Он предоставляет простой способ обернуть MSBuild.
 EBGreen23 янв. 2009 г., 16:11
Это нормально тогда. Просто хотел убедиться, что это не рефлекторная реакция.
 Milan Gardian23 янв. 2009 г., 16:15
Извини, я был слишком резок. Я просто разочарован, потому что не могу найти достойное описание того, как использовать последний (3.5) класс BuildEngine.Engine (google, SO, MSDN). Информация MSDN устарела; он использует методы, которые были устаревшими в 3.5 impl класса Engine (я использовал Reflector для исследования).
 Milan Gardian23 янв. 2009 г., 16:07
Да, я прочитал страницу. И он описывает этот похожий на грабли инструмент сборки «без налога на XML». Я использовал rake до того, как переключился на msbuild, и я не вернусь :-). Механизм, который использует psake для вызова msbuild, заключается в том, что он добавляет его к «пути» - то есть внешнему процессу. Это именно то, чего я не хочу.
Решение Вопроса

который работал и давал результат, был:

[void][System.Reflection.Assembly]::Load('Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
$engine = New-Object Microsoft.Build.BuildEngine.Engine
$engine.RegisterLogger((New-Object Microsoft.Build.BuildEngine.ConsoleLogger))
$engine.BuildProjectFile('fullPath\some.proj')

Однако оказывается, что встраивание MSBuild непосредственно в Powershell (V1) проблематично:

'MSBUILD : warning MSB4056: The MSBuild engine must be called on
a single-threaded-apartment. Current threading model is "MTA".
Proceeding, but some tasks may not function correctly.'

Почему мы все еще платим налог на прибыль в 2009 году, работая в управляемой среде?

Мой вывод заключается в том, что встраивание MSBuild в Powershell (V1) не очень хорошая идея. Для справки, я также включаю основанный на процессах подход, который я в итоге использовал:

[void][System.Reflection.Assembly]::Load('Microsoft.Build.Utilities.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
$msbuild = [Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToDotNetFrameworkFile("msbuild.exe", "VersionLatest")
&$msbuild fullPath\some.proj

Ваш ответ на вопрос