У меня есть решение VS 2015 C # с основным исполняемым файлом и некоторыми проектами библиотеки. Это инструмент анализа кода, он также использует Roslyn и MSBuild, поэтому для основной сборки требуются Microsoft.CodeAnalysis и Microsoft.Build от NuGet. Моей недавней задачей было обновить прежний пакет с 1.x до 2.x. Это не прошло свободно, но я заставил это работать, теперь требуется Microsoft.CodeAnalysis 2.8.2
и Microsoft.Build 15.7.179
. Все работает, как и ожидалось, при сборке непосредственно из Visual Studio.
Однако, когда я собираю одно и то же решение (и, следовательно, те же файлы csproj) с MSBuild 14 из командной строки, производимый исполняемый файл отличается и вылетает во время выполнения со следующим стеком, когда он пытается создать рабочее пространство MSBuild:
Nem kezelt kivétel: System.Reflection.ReflectionTypeLoadException: Egy vagy több kért típus nem tölthető be. További tájékoztatást a LoaderExceptions tulajdonság lekérésével kaphat.
a következő helyen: System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
a következő helyen: System.Reflection.RuntimeAssembly.get_DefinedTypes()
a következő helyen: System.Composition.Hosting.ContainerConfiguration.<>c.<WithAssemblies>b__16_0(Assembly a)
a következő helyen: System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext()
a következő helyen: System.Composition.TypedParts.TypedPartExportDescriptorProvider..ctor(IEnumerable`1 types, AttributedModelProvider attributeContext)
a következő helyen: System.Composition.Hosting.ContainerConfiguration.CreateContainer()
a következő helyen: Microsoft.CodeAnalysis.Host.Mef.MefHostServices.Create(IEnumerable`1 assemblies)
a következő helyen: Microsoft.CodeAnalysis.Host.Mef.DesktopMefHostServices.get_DefaultServices()
a következő helyen: Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.Create(IDictionary`2 properties)
a következő helyen: Columbus.CSAN.RoslynParser.AbstractOpen..ctor(String path, String configuration, String platform)
a következő helyen: Columbus.CSAN.RoslynParser.FileOpen..ctor(String path, String config, String platform)
a következő helyen: Columbus.CSAN.RoslynParser.AbstractOpen.CreateInstance(String path, String configuration, String platform)
a következő helyen: Columbus.CSAN.MainProgram.Main(String[] args)
Глядя на свойство LoaderExceptions, я обнаружил следующее:
A(z) "System.Collections.Immutable, Version=1.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" fájl vagy szerelvény, illetve annak egyik függősége nem tölthető be. A megtalált szerelvény jegyzékdefiníciója nem egyezik a szerelvény hivatkozásával. (A kivétel HRESULT-értéke: 0x80131040)
Конечно, он не может найти 1.2.0.0 System.Collections.Immutable, потому что нам требуется 1.3.1 (что еще более усложняет сборку версии 1.2.1.0) в packages.config через эту цепочку:
Microsoft.CodeAnalysis 2.8.2
Microsoft.CodeAnalysis.CSharp.Workspaces 2.8.2
Microsoft.CodeAnalysis.CSharp 2.8.2
Microsoft.CodeAnalysis.Common 2.8.2
System.Collections.Immutable 1.3.1
Команда выглядит так: msbuild All.sln /t:Build /p:Configuration=Debug /p:Platform=x64 /verbosity:diagnostic
В выводе MSBuild по ссылкам проблемного проекта:
System.Collections.Immutable, Version=1.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL
HintPath = ..\..\packages\System.Collections.Immutable.1.3.1\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll
Private = True
У меня действительно нет идей, почему во время выполнения требуется более старая версия библиотеки, потому что 1.2.0.0
не отображается даже в подробном журнале сборки, только 1.2.1.0
из пакета 1.3.1
.
Чтобы уточнить: я строю свой собственный проект с VS2015 / MSBuild14, потому что это только C # 6.0, но я хочу, чтобы он мог анализировать C # 7.0, поэтому мне требуются Roslyn 2 и MSBuild 15 как пакет.