MSBuild 14 создает исполняемый файл, требующий более старой зависимости, чем указанный - PullRequest
0 голосов
/ 30 августа 2018

У меня есть решение 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 как пакет.

1 Ответ

0 голосов
/ 31 августа 2018

Некоторые сборки, на которые ссылается этот проект, ссылаются на 1.2.0.0. Вы можете использовать fuslogvw.exe или просто добавить EnableLog со значением DWORD 1 в раздел реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Fusion.

Но для ее решения вам нужно добавить перенаправление привязки сборки в ваш файл конфигурации:

<runtime>  
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" appliesTo="v1.0.3705">  
        <assemblyIdentity name="System.Collections.Immutable"  
                          publicKeyToken="b03f5f7f11d50a3a"  
                          culture="neutral" />  
            <bindingRedirect oldVersion="0.0.0.0-1.2.1.0"  
                             newVersion="1.2.1.0"/>
        </dependentAssembly>
    </assemblyBinding>  
</runtime>
...