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 для компиляции.