【问题标题】:How can I get rid of package reference conflicts in a VSIX project如何摆脱 VSIX 项目中的包引用冲突
【发布时间】: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


    【解决方案1】:

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

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

    构建项目,然后您会收到相同的警告。

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

    顺便说一下,我还没有更新到3.0.0.0版本,因为这个 版本仅针对 .NET Standard,所以我认为它不兼容 使用框架 4.7.2。

    请查看this document了解有关.net标准和.net框架之间兼容性的详细信息。

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

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

    我建议你将Microsoft.CodeAnalysis更新为3.2.0 version,也可能需要更新Microsoft.CodeAnalysis.Analyzers等相关包,然后这个问题就会消失。

    希望对你有帮助:)

    【讨论】:

    • 非常感谢您的详细回答。我已将几乎所有软件包更新到最新版本(以及 Visual Studio),看起来这些特定错误已修复。我还有一些其他的冲突,我希望可以自己解决。如果我无法修复它们,我会再次询问。
    • @PhilJollans 很高兴知道它会有所帮助:)
    猜你喜欢
    • 2023-04-05
    • 2013-01-04
    • 2019-12-18
    • 2020-03-07
    • 1970-01-01
    • 2018-03-30
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多