Мы строим с использованием MSBuild2005 с самописным классом Logger, который отслеживает, какие проекты в настоящее время строятся, и назначает этим проектам входящие ошибки / предупреждения. Это было довольно сложно, потому что MSBuild также вызывает ProjectStarted / FinishedEventArgs, когда «каким-то образом» обращается к проектам, на которые есть ссылки. Но у меня все заработало.
Теперь мы хотим перейти на MSBuild2008. Все работает нормально, пока мы не включим параллельные сборки (/ m: 2 или выше; это функция, которую я ждал!). Насколько я понимаю, я могу отслеживать параллельные задачи, наблюдая за свойством ThreadId в BuildEventMessages. Но это не работает должным образом, как только вы включаете параллельные сборки. У меня был случай, когда один проект был построен на ThreadId 1, а другой запускался на ThreadId 5. Но после этого третья программа запускалась с ThreadId 5! Любопытно, что эти проекты ведут себя «как стек»: второй завершается раньше, чем первый. Вот и подумал: может, и нормально, но как мне присвоить ошибки. Чтобы убедиться, что я вставил ошибочный код в один проект. И результат был таков: в сообщении об ошибке был совершенно новый ThreadId (не 1 или 5, а 6)!
Итак, мой вопрос: как я могу назначить сообщения об ошибках / предупреждениях проектам?





Люблю ответ:
В .Net 3.5 класс BuildEventArgs содержит новое свойство BuildEventContext, которое содержит ProjectContextId. Это уникально и позволяет точно назначать.