Microsoft.Build.BuildEngine.Engine выдает ошибку при сборке приложения WPF - PullRequest
2 голосов
/ 12 октября 2009

Я использую Microsoft.Build.BuildEngine.Engine для создания приложения WPF. Это успешно работает для библиотек классов и веб-приложений, но теперь, пытаясь использовать его для создания приложения WPF, я получаю следующую ошибку:

Target MarkupCompilePass1: C: \ Windows \ Microsoft.NET \ Framework \ v3.5 \ Microsoft.WinFX.targets (294,9): ошибка MC1000: неизвестная ошибка сборки, API ограничение: сборка 'file: /// C: \ Program Files (X86) \ Ссылка Сборки \ Microsoft \ Framework \ v3.0 \ PresentationCore.dll» уже загружен из другого место нахождения. Он не может быть загружен с новое место в том же AppDomain. Готово строительство цели "MarkupCompilePass1" в проекте "TestWindowsApplication.csproj" - FAILED.

Это приложение прекрасно собирается при сборке с использованием VisualStudio 2008 (т.е. сборка из меню), но с использованием Microsoft.Build.BuildEngine.Engine выдает эту ошибку сборки. Кто-нибудь знает, что здесь происходит?

Ответы [ 2 ]

3 голосов
/ 15 октября 2009

У меня была такая же проблема, и я обнаружил это на MSDN, который говорит

По умолчанию компиляция разметки выполняется в тот же AppDomain, что и MSBuild двигатель. Это дает нам значительные прирост производительности. Такое поведение может быть переключенным с AlwaysCompileMarkupFilesInSeparateDomain имущество. Последний имеет Преимущество разгрузки всех ссылок сборки разгрузкой отдельных AppDomain.

Так как сгенерированное исключение указывало, что PresentationCore был загружен в тот же домен приложения, я переключил это свойство, используя:

projectToBuild.SetProperty("AlwaysCompileMarkupFilesInSeparateDomain", "True");

Который, казалось, был ключом.

Надеюсь, это поможет.

2 голосов
/ 12 октября 2009

Теперь это интересно! Проверьте эту проблему Я попал на прошлой неделе. То же исключение и сообщение об ошибке, относящиеся к WPF.

Если вы посмотрите на комментарии к задаче MSBuild MarkupCompilePass1, вызывающей исключение, это может быть подсказкой о том, почему она работает внутри VS2008, но не из вашего процесса MSBuild:

<!--
When performing an intellisense compile, we don't want to abort the compile if 
MarkupCompilePass1 fails.  This would prevent the list of files from being handed 
off to the compiler, thereby breaking all intellisense.  For intellisense compiles
we set ContinueOnError to true.  The property defined here is used as the value
for ContinueOnError on the MarkupCompilePass1 task.
-->
...