Разница при построении решения 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?