MSBuild правильно строит проекты с проектной ссылкой, но не из решения

Когда я создаю A.sln, который включает в себя 2 проекта B.csproj и C.csproj, которые имеют внутренние ссылки на проекты, он вызывает опорные ошибки в MSBuild. Но когда я строю B.csproj и C.csproj отдельно в MSBuild, это не вызывает ошибок. А также создание A.sln в VS IDE также не вызывает ошибок. Я использую .NET 2.0 framework. Ниже вы найдете скрипты, используемые для создания sln и projs.

MSBuild "<path>/A.sln" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\A.sln.log /verbosity:normal

MSBuild "<path>/B.csproj" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\B.csproj.log /verbosity:normal 

MSBuild "<path>/C.csproj" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\C.csproj.log /verbosity:normal 

Edit:

Все ошибки, которые вы выбрали, - это код для недостающих ссылок (все ссылки на проекты). Я получаю только три типа ошибок, как указано ниже.

error CS0012: Тип "X" определен в сборке, на которую не ссылаются. Вы должны добавить ссылку на сборку 'Y, Версия = 2.0.0.0, Культура = нейтральная, PublicKeyToken = aad4cbe5d7c27078'.

ошибка CS0234: тип или пространство имен имя 'X' не существует в namespace 'Y' (вам не хватает сборка?)

ошибка CS0246: тип или пространство имен имя "X" не найдено (вы отсутствует директива using или сборка?)

Я удалил все ранее построенные DLL из путей сборки до создания из IDE и MSBuild. Но IDE просто отлично работает и не показывает ссылочный отсутствующий индикатор в разделе "Refrences" для проекта.

Никаких ссылочных путей, добавленных вручную в среде IDE.

Другое обновление:

Я только заметил, что когда я открываю оба проекта из решения, ссылки правильно указывают на IDE. Но когда я открываю проекты отдельно в IDE, исчезают недостающие ссылки, о которых я упоминал в MSBuild. Очень странно.

Итак, чтобы подвести итог,

Buiilding.proj в MSBuild - хорошо

Buiilding.proj в IDE - Ошибка

Buiilding.sln в MSBuild - Ошибка

Buiilding.sln в IDE - хорошо

Выглядит очень странно для меня. Очень благодарен.

Ответ 1

MSBuild и VS используют ссылки на проекты и зависимости проектов для выбора порядка сборки решения. Помимо этого, он undefined - и обычно отличается между ними. Проверьте, все ли они правильные. Зависимости проектов задаются в свойствах вашего решения. Если это не сработает, дважды проверьте, что идентификаторы GUID в ссылках проекта в ваших проектах соответствуют тем, которые содержатся в решении. Иногда воссоздание решения может исправить их.

Ответ 2

Для меня, когда у меня была эта (или аналогичная) проблема, ручная проверка (и исправление) строк строк устраняет мою проблему. Это раздражает прослеживание путей между файлами .sln и .csproj, но оно работает.

Я обычно отбрасываю ссылку на проект и повторно добавляю его, и это устраняет проблему (после того, как я нашел несоответствующие несоответствия). Может быть, я должен сначала попробовать это. Это проще.

Ответ 3

Некоторые вещи, которые следует учитывать: создание решения в среде IDE - это не то же самое, что запуск MSBUILD в файле .sln. Вместо этого вы можете попробовать использовать devenv.exe/rebuild A.sln. IDE воспроизводит несколько игр, чтобы создать файл .sln, включая создание "эквивалентного" проекта в стиле MSBUILD.

Кроме того, среда IDE не просто выдает команды MSBUILD. Существует взаимодействие между ними для повышения производительности. Например, задачи CSC в проекте, вероятно, выполняются внутри IDE, а не как отдельные сборки командной строки, поскольку MSBUILD их породил.

Вы также должны рассмотреть возможность получения Process Monitor из http://technet.microsoft.com/sysinternals/, чтобы посмотреть, к каким файлам обращаются.

Ответ 4

Как упоминал Джон Скит, сообщение об ошибке было бы полезно узнать, в чем проблема. Однако без каких-либо подробностей, если он создается в среде IDE, но не создается в MSBuild, похоже, что у вас могут быть библиотеки DLL, которые вы указываете в своих проектах, которые недоступны на пути, на котором вы строите решение. Возможно, вы вручную копировали их куда-то, где IDE могла их найти, или у вас в справочной системе, установленной в вашей среде IDE, для поиска в определенной папке.

Просто что-то, чтобы проверить, когда вы получите эти другие детали на вопрос.

РЕДАКТИРОВАТЬ: Теперь, когда есть некоторые детали, это может быть проблемой сборки. Есть ли ссылка на проект в проекте B для проекта C? Если это так, вам может потребоваться изменить заказ для создания проекта C перед проектом B.

Ответ 5

Удалите сборку из GAC (C:\WINDOWS\assembly folder - выберите ваш assebly и щелкните правой кнопкой мыши и удалите).

Поскольку решение сохраняет ссылку с помощью guid, и если этот указатель находится в GAC, он будет продолжать использовать версию GAC для компиляции.