首页 > 解决方案 > 如何摆脱 VSIX 项目中的包引用冲突

问题描述

我有一个包含多个项目的解决方案,它会生成一个 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 不兼容。)

标签: msbuildnugetapp-configvisual-studio-extensionsassembly-binding-redirect

解决方案


有什么办法可以消除 VSIX 项目中的这些警告?

重现这三个警告的简单方法是创建一个 vsix 空项目,然后以格式引用该Microsoft.CodeAnalysis version-1.0.0包。PackageReference

构建项目,然后您可以获得相同的警告。 在此处输入图像描述

所以我认为你引用的包与带有VS2019相关sdk的vsix项目不兼容。请查看此文档,对于 VS2019,您应该使用 3.0 或更高版本。

顺便说一句,我还没有更新到 3.0.0.0 版本,因为这个版本只针对 .NET Standard,所以我认为它与 Framework 4.7.2 不兼容。

有关 .net 标准和 .net 框架之间兼容性的详细信息,请查看此文档

请参阅:使用为 .NET Framework 4.6.1 项目中的这些版本构建的 .NET Standard 库存在几个问题。对于需要使用此类库的 .NET Framework 项目,我们建议您将项目升级到面向 .NET Framework 4.7.2 或更高版本

实际上引用一个以.net standard 2.0in.net framework 4.7.2 projects和更高为目标的程序集是官方推荐的方式。所以你不必担心这个。

我建议你更新Microsoft.CodeAnalysis3.2.0 version,你也可能需要更新相关的包,比如Microsoft.CodeAnalysis.Analyzers,然后这个问题就会消失。

希望能帮助到你:)


推荐阅读