Microsoft.Build.BuildEngine.Engine выдает ошибку при сборке приложения WPF
Я использую Microsoft.Build.BuildEngine.Engine для создания приложения WPF. Это успешно работает для библиотек классов и веб-приложений, но теперь, пытаясь использовать его для создания приложения WPF, я получаю следующую ошибку:
Target MarkupCompilePass1: c: \ Windows \ Microsoft.NET \ Framework \ v3.5 \ Microsoft.WinFX.targets (294,9): ошибка MC1000: неизвестная ошибка сборки, "ограничение API: сборка", файл:///C:\Program Files (x86)\ Справочные сборки \Microsoft\Framework\v3.0\PresentationCore.dll'уже загружены из другого места. Его нельзя загрузить из нового местоположения в том же домене приложения.' Завершено создание цели "MarkupCompilePass1" в проекте "TestWindowsApplication.csproj" - СБОЙ.
Это приложение прекрасно собирается при сборке с использованием VisualStudio 2008 (т.е. сборка из меню), но с использованием Microsoft.Build.BuildEngine.Engine выдает эту ошибку сборки. Кто-нибудь знает, что здесь происходит?
2 ответа
У меня была такая же проблема, и я нашел это на MSDN, который говорит
По умолчанию компиляция разметки выполняется в том же домене приложений, что и механизм MSBuild. Это обеспечивает нам значительный прирост производительности. Это поведение можно переключать с помощью свойства AlwaysCompileMarkupFilesInSeparateDomain. Последнее имеет преимущество в том, что выгружает все эталонные сборки, выгружая отдельный AppDomain.
Так как сгенерированное исключение указывало, что PresentationCore был загружен в тот же домен приложений, я переключил это свойство, используя
projectToBuild.SetProperty("AlwaysCompileMarkupFilesInSeparateDomain", "True");
Который, казалось, был ключом.
Надеюсь, это поможет.
Теперь это интересно! Проверьте эту проблему, я попал на прошлой неделе. То же исключение и сообщение об ошибке, относящиеся к 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.
-->