Разница при построении решения VS в VS и MSBuild

Я также опубликовал это как проблему в github для проекта msbuild.

У меня проблема со сборкой некоторых проектов. Я нашел различия между созданием моих решений в VS (оно работает нормально) и созданием решений с помощью msbuild через командную строку (это не помогает).

Мне удалось сделать небольшой образец, который иллюстрирует проблему. BuildError.zip

В основном у меня есть 2 решения SolA.sln а также SolAandB.sln, SolA.sln содержит только проект A.csproj в то время как SolAandB.sln содержит как A.csproj а также B.csproj, Проект A.csproj это просто библиотека классов, в то время как B.csproj это проект командной строки, который ссылается на проект A.csproj, Тонкая особенность этих проектов в том, что A.csproj настроен, чтобы не быть встроенным SolAandB.sln, Причина этого в том, что у меня много проектов (более 300, некоторые из которых на C#, а другие на C++ управляемые и неуправляемые), а некоторые проекты включены в более чем одно решение (в основном, для добавления ссылок к проекту), но я хочу построить проект только один раз.

Когда я строю SolAandB.sln в VS (я использую VS2015 с обновлением 1, но не верьте, что это что-то меняет), я вижу, что вызов csc.exe за B.csproj выглядит следующим образом (для ясности я добавил разрывы строк между аргументами):

C:\Program Files (x86)\MSBuild\14.0\bin\csc.exe
 /noconfig
 /nowarn:1701,1702,2008
 /nostdlib+
 /platform:anycpu32bitpreferred
 /errorreport:prompt
 /warn:4
 /define:DEBUG;TRACE
 /errorendlocation
 /preferreduilang:en-US
 /highentropyva+
 /reference:"F:\Visual Studio 2015\Projects\BuildError\A\bin\Debug\A.dll"
 /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\mscorlib.dll"
 /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\System.Core.dll"
 /debug+
 /debug:full
 /filealign:512
 /optimize-
 /out:obj\Debug\B.exe
 /ruleset:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\\Rule Sets\MinimumRecommendedRules.ruleset"
 /subsystemversion:6.00
 /target:exe
 /utf8output
 Program.cs
 Properties\AssemblyInfo.cs
 "C:\Users\Fede\AppData\Local\Temp\.NETFramework,Version=v4.5.2.AssemblyAttributes.cs"
 obj\Debug\\TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs
 obj\Debug\\TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
 obj\Debug\\TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs

Обратите внимание /reference:"F:\Visual Studio 2015\Projects\BuildError\A\bin\Debug\A.dll" который правильно указывает на вывод A.csproj для выбранной конфигурации сборки. Если бы я построил в Releaseссылка правильно указала бы на выходные данные сборки сборки A.csproj,

Результат этой сборки зависит от наличия A.csproj уже построено, что у меня есть. Вы можете увидеть пример сценария сборки в BuildSolutions.proj который первым строит SolA.sln а потом SolAandB.sln,

Теперь, если я строю SolAandB.sln через командную строку или в результате построения BuildSolutions.projЯ вижу, что обращение к csc.exe за B.csproj как следует:

C:\Program Files (x86)\MSBuild\14.0\bin\csc.exe
 /noconfig
 /nowarn:1701,1702
 /nostdlib+
 /platform:anycpu32bitpreferred
 /errorreport:prompt
 /warn:4
 /define:DEBUG;TRACE
 /highentropyva+
 /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\mscorlib.dll"
 /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\System.Core.dll"
 /debug+
 /debug:full
 /filealign:512
 /optimize-
 /out:obj\Debug\B.exe
 /ruleset:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Static Analysis Tools\\Rule Sets\MinimumRecommendedRules.ruleset"
 /subsystemversion:6.00
 /target:exe
 /utf8output
 Program.cs
 Properties\AssemblyInfo.cs
 "C:\Users\Fede\AppData\Local\Temp\.NETFramework,Version=v4.5.2.AssemblyAttributes.cs"

Как вы можете видеть, помимо нескольких явно тонких различий, самое большое отличие состоит в том, что аргумент /reference:"F:\Visual Studio 2015\Projects\BuildError\A\bin\Debug\A.dll" отсутствует, и, следовательно, проект не может быть построен с ошибкой error CS0246: The type or namespace name 'A' could not be found (are you missing a using directive or an assembly reference?),

Вопрос

Как я могу построить решение таким образом, чтобы когда csc.exe вызывается так же, как когда я создаю решение в visual studio?

0 ответов

Другие вопросы по тегам