我有一个带有主要可执行文件和一些库项目的 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
即使在详细的构建日志中也不会出现,仅1.2.1.0
来自 package 1.3.1
。
澄清一下:我正在使用 VS2015/MSBuild14 构建我自己的项目,因为它只是 C# 6.0,但希望它能够分析 C# 7.0,这就是为什么我需要 Roslyn 2 和 MSBuild 15 作为一个包。