【发布时间】:2019-08-10 18:41:00
【问题描述】:
我有一个包含多个项目的解决方案,它会生成一个 Visual Studio 包。
一些项目和 Nuget 包如下所示。顶级 Visual Studio 扩展是 MultiLanguageWPF。
MultiLanguageWPF
|
+-- MultiLanguageLegacy
| | Nuget: Microsoft.CodeAnalysis.Analyzers Version 1.0.0
| |
| +-- MultiLangCodeParser
| | Nuget: Microsoft.CodeAnalysis.Analyzers Version 1.0.0
| | Nuget: Microsoft.CodeAnalysis.Compilers Version 1.0.0
| |
+---+-- MultiLangCommon
Nuget: Microsoft.CodeAnalysis Version 1.0.0
Nuget: Microsoft.CodeAnalysis.Analyzers Version 1.0.0
所有这些 Nuget 包都包含在版本 1.0.0 中。所有项目都是针对框架 4.7.2 构建的。
这个问题是关于为 MultiLanaguageWPF 项目生成的三个警告:
发现不同版本的“Microsoft.CodeAnalysis”之间存在冲突 无法解决。这些引用冲突列在 日志详细程度设置为详细时的构建日志。
发现不同版本的冲突 无法解决的“Microsoft.CodeAnalysis.VisualBasic”。 这些引用冲突在构建日志中列出 详细程度设置为详细。
发现不同版本的冲突 无法解决的“Microsoft.CodeAnalysis.CSharp”。这些 当日志详细程度为 设置为详细。
Microsoft.CodeAnalysis.VisualBasic 和 Microsoft.CodeAnalysis.CSharp 包是 Microsoft.CodeAnalysis.Compilers 包的依赖项。
这三个警告是为 MultiLanaguageWPF 项目生成的,它实际上并没有使用这些包。显然,所有引用的 DLL 都必须拉入顶层项目并最终打包到 VSIX 安装中,所以我想这确实有意义。
按照警告消息中的建议,我已将日志详细程度设置为详细。对于 Microsoft.CodeAnalysis 包,这是我看到的一些内容。
16> Primary reference "Microsoft.CodeAnalysis, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35".
16> Resolved file path is "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.common\1.0.0\lib\net45\Microsoft.CodeAnalysis.dll".
16> Reference found at search path location "{RawFileName}".
16> Found related file "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.common\1.0.0\lib\net45\Microsoft.CodeAnalysis.xml".
16> This reference is not "CopyLocal" because at least one source item had "Private" set to "false" and no source items had "Private" set to "true".
16> The ImageRuntimeVersion for this reference is "v4.0.30319".
16> Unified Dependency "Microsoft.CodeAnalysis, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35".
16> Using this version instead of original version "1.0.0.0" in "C:\MultiLang_Version_7_1\VS2013\MultiLang\bin\Debug\MultiLanguageLegacy.dll" because AutoUnify is 'true'.
16> Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.csharp\1.0.0\lib\net45\Microsoft.CodeAnalysis.CSharp.dll" because AutoUnify is 'true'.
16> Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.csharp.workspaces\1.0.0\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll" because AutoUnify is 'true'.
16> Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.visualbasic\1.0.0\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll" because AutoUnify is 'true'.
16> Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.visualbasic.workspaces\1.0.0\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll" because AutoUnify is 'true'.
16> Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.workspaces.common\1.0.0\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll" because AutoUnify is 'true'.
16> Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.codeanalysis.workspaces.common\1.0.0\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll" because AutoUnify is 'true'.
16> Using this version instead of original version "1.0.0.0" in "C:\Users\Phil\.nuget\packages\microsoft.visualstudio.languageservices\1.0.0\lib\net45\Microsoft.VisualStudio.LanguageServices.dll" because AutoUnify is 'true'.
16> Using this version instead of original version "1.0.0.0" in "C:\MultiLang_Version_7_1\VS2013\MultiLang\bin\Debug\MultiLangCommon.dll" because AutoUnify is 'true'.
16> Using this version instead of original version "1.0.0.0" in "C:\MultiLang_Version_7_1\VS2013\MultiLang\bin\Debug\MultiLangCodeParser.dll" because AutoUnify is 'true'.
16> Could not resolve this reference. Could not locate the assembly "Microsoft.CodeAnalysis, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.
似乎是 AutoUnify 机制导致它选择版本 3.0.0.0 而不是版本 1.0.0.0。
根据我对这个错误的了解,如果它是一个 EXE 项目,则可以使用文件 app.config 中的 bindingRedirect 来修复它。
我的理解是,这不适用于 DLL 项目,因此不适用于 Visual Studio Extension (VSIX) 项目。
有什么方法可以消除 VSIX 项目中的这些警告?
(顺便说一下,我还没有更新到3.0.0.0版本,因为这个版本只针对.NET Standard,所以我认为它与Framework 4.7.2不兼容。)
【问题讨论】:
标签: msbuild nuget app-config visual-studio-extensions assembly-binding-redirect