MSBuild 14 生成的可执行文件需要比引用旧的依赖项
MSBuild 14 produces executable requiring older dependency than referenced
我有一个 VS 2015 C# 解决方案,其中包含一个主要可执行文件和一些库项目。这是一个代码分析器工具,它也使用 Roslyn 和 MSBuild,因此主程序集需要来自 NuGet 的 Microsoft.CodeAnalysis 和 Microsoft.Build。我最近的任务是将以前的包从 1.x 更新到 2.x。它并不流畅,但我成功了,它现在需要 Microsoft.CodeAnalysis 2.8.2
和 Microsoft.Build 15.7.179
。直接从 Visual Studio 构建时,一切都按预期工作。
但是,当我从命令行使用 MSBuild 14 构建相同的解决方案(以及相同的 csproj 文件)时,生成的可执行文件是不同的,并且在尝试创建 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)
当然找不到System.Collections.Immutable的1.2.0.0,因为我们通过这个链在packages.config中需要1.3.1(这是为了引起更多的混淆是汇编版本1.2.1.0) :
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
甚至没有出现在详细的构建日志中,只有包 [=19] 中的 1.2.1.0
=].
澄清一下:我正在使用 VS2015/MSBuild14 构建自己的项目,因为它只是 C# 6.0,但希望它能够分析 C# 7.0,这就是为什么我需要 Roslyn 2 和 MSBuild 15作为一个包。
该项目引用的某些程序集正在引用 1.2.0.0。您可以使用 fuslogvw.exe 或仅将 DWORD
值为 1
的 EnableLog
添加到 HKEY_LOCAL_MACHINE\Software\Microsoft\Fusion
注册表项。
但要解决它,您需要在配置文件中添加 assembly binding redirect:
<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>
我有一个 VS 2015 C# 解决方案,其中包含一个主要可执行文件和一些库项目。这是一个代码分析器工具,它也使用 Roslyn 和 MSBuild,因此主程序集需要来自 NuGet 的 Microsoft.CodeAnalysis 和 Microsoft.Build。我最近的任务是将以前的包从 1.x 更新到 2.x。它并不流畅,但我成功了,它现在需要 Microsoft.CodeAnalysis 2.8.2
和 Microsoft.Build 15.7.179
。直接从 Visual Studio 构建时,一切都按预期工作。
但是,当我从命令行使用 MSBuild 14 构建相同的解决方案(以及相同的 csproj 文件)时,生成的可执行文件是不同的,并且在尝试创建 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)
当然找不到System.Collections.Immutable的1.2.0.0,因为我们通过这个链在packages.config中需要1.3.1(这是为了引起更多的混淆是汇编版本1.2.1.0) :
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
甚至没有出现在详细的构建日志中,只有包 [=19] 中的 1.2.1.0
=].
澄清一下:我正在使用 VS2015/MSBuild14 构建自己的项目,因为它只是 C# 6.0,但希望它能够分析 C# 7.0,这就是为什么我需要 Roslyn 2 和 MSBuild 15作为一个包。
该项目引用的某些程序集正在引用 1.2.0.0。您可以使用 fuslogvw.exe 或仅将 DWORD
值为 1
的 EnableLog
添加到 HKEY_LOCAL_MACHINE\Software\Microsoft\Fusion
注册表项。
但要解决它,您需要在配置文件中添加 assembly binding redirect:
<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>