VS2010 и MSBuild получают разные результаты в комбинированном решении C ++ / C #

У меня есть большое решение VS2010, которое содержит кучу проектов C #. Один из этих проектов использует библиотеку C ++ (родную, также известную как неуправляемая) через P / Invoke. Чтобы убедиться, что все работает правильно, я включил указанный проект C ++ в то же решение. Вот тут-то и начинаются проблемы.

Вкратце : MSBuild таинственным образом удаляет некоторые выходные файлы, а VS2010 строит правильно.
который содержит множество проектов C #. Один из этих проектов использует библиотеку C ++ (родную, также известную как неуправляемая) через P / Invoke. Чтобы убедиться, что все построено правильно, у меня есть ...

У меня есть большое решение VS2010, которое содержит кучу проектов C #. Один из этих проектов использует библиотеку C ++ (родную, также известную как неуправляемая) через P / Invoke. Чтобы убедиться, что все работает правильно, я включил указанный проект C ++ в то же решение. Вот где начинаются проблемы.

Короче : MSBuild таинственным образом удаляет некоторые выходные файлы, в то время как VS2010 строит правильно.
который содержит множество проектов C #. Один из этих проектов использует библиотеку C ++ (родную, также известную как неуправляемая) через P / Invoke. Чтобы убедиться, что все работает правильно, у меня есть ...

У меня есть большое решение VS2010, которое содержит кучу проектов C #. Один из этих проектов использует библиотеку C ++ (родную, также известную как неуправляемая) через P / Invoke. Чтобы убедиться, что все работает правильно, я включил указанный проект C ++ в то же решение. Вот где начинаются проблемы.

Короче : MSBuild таинственным образом удаляет некоторые выходные файлы, в то время как VS2010 строит правильно.
aka unmanaged) через P / Invoke. Чтобы убедиться, что все работает правильно, я включил указанный проект C ++ в то же решение. Вот где начинаются проблемы.

Короче : MSBuild таинственным образом удаляет некоторые выходные файлы, в то время как VS2010 строит правильно.
aka unmanaged) через P / Invoke. Чтобы убедиться, что все работает правильно, я включил указанный проект C ++ в то же решение. Вот тут-то и начинаются проблемы.

Вкратце : MSBuild таинственным образом удаляет некоторые выходные файлы, а VS2010 строит правильно.
.

Долгая история :
Раньше (VS2005 / 2008) я бы использовал изящную функцию под названием «Зависимости проекта». Это то, что позволяет вам выбирать, от каких конкретных проектов зависит данный проект, так что среда обязательно создаст их в первую очередь.

VS2010, однако, сдвинулся в сторону MSBuild, и теперь зависимости проектов просто не нужны. не работает. Они просто этого не делают. (см. этот вопрос , например) Теперь, чтобы гарантировать, что мой проект C ++ будет собран раньше, чем тот, который его использует, мне нужно «Добавить ссылку». Итак, я сделал это. И все вроде нормально.

Но затем я захожу в командную строку и запускаю MSBuild для создания того же решения. И снова все строится нормально. Но когда я смотрю в выходную папку, выходных данных проекта C ++ там нет!

Вывод консоли MSBuild ясно показывает, что проект C ++ действительно был построен в какой-то момент. И я даже вставил несколько операторов « dir bin \ MYPROJNAME.dll » в качестве шагов после сборки в некоторые проекты, чтобы проверить, есть ли там файлы - , а они ! Здесь - снимок экрана окна командной строки. Красным кружком отмечен момент нахождения файлов (вверху), а затем момент отсутствия файлов (внизу).

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

Это действительно выглядит так Второе событие сборки - это то, что приводит к удалению файлов: когда я вообще отключил сборку этого проекта (через свойства решения), он был построен только один раз, и файлы были там в конце. Я мог бы назвать это «решением», но тогда он ломается в самой Visual Studio: VS просто не создает проект.

Другой способ исправить это - удалить «Справочник по проекту» из потребляющего C #. проект. Тогда MSBuild построит проект C ++ только один раз, и файлы будут там. Но затем он ломается еще в одном месте: изменения в проекте C ++ не вызовут перестройку потребляющего проекта C #.

Итак, вопрос : как мне заставить MSBuild не удалять долбанные файлы?

5
задан Community 23 May 2017 в 12:19
поделиться